FragmentManager.java revision cba2e2c881e8e16ea5025b564c94320174d65f01
1cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn/* 2cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Copyright (C) 2011 The Android Open Source Project 3cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 4cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * you may not use this file except in compliance with the License. 6cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * You may obtain a copy of the License at 7cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 8cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 10cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * See the License for the specific language governing permissions and 14cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * limitations under the License. 15cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 16cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 17cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornpackage android.support.v4.app; 18cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 19cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.content.res.Configuration; 20cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.os.Bundle; 21cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.os.Handler; 22cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.os.Looper; 23cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.os.Parcel; 24cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.os.Parcelable; 25cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.support.v4.util.DebugUtils; 26cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.support.v4.util.LogWriter; 27cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.util.Log; 28cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.util.SparseArray; 29cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.view.animation.Animation; 30cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.view.animation.AnimationUtils; 31cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.view.animation.Animation.AnimationListener; 32cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.view.Menu; 33cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.view.MenuInflater; 34cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.view.MenuItem; 35cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.view.View; 36cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.view.ViewGroup; 37cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 38cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport java.io.FileDescriptor; 39cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport java.io.PrintWriter; 40cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport java.util.ArrayList; 41cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport java.util.Arrays; 42cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 43cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn/** 44cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Static library support version of the framework's {@link android.app.FragmentManager}. 45cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Used to write apps that run on platforms prior to Android 3.0. When running 46cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * on Android 3.0 or above, this implementation is still used; it does not try 47cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * to switch to the framework's implementation. See the framework SDK 48cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * documentation for a class overview. 49cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 50cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * <p>Your activity must derive from {@link FragmentActivity} to use this. 51cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 52cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornpublic abstract class FragmentManager { 53cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 54cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Representation of an entry on the fragment back stack, as created 55cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * with {@link FragmentTransaction#addToBackStack(String) 56cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * FragmentTransaction.addToBackStack()}. Entries can later be 57cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * retrieved with {@link FragmentManager#getBackStackEntryAt(int) 58cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * FragmentManager.getBackStackEntry()}. 59cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 60cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * <p>Note that you should never hold on to a BackStackEntry object; 61cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * the identifier as returned by {@link #getId} is the only thing that 62cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * will be persisted across activity instances. 63cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 64cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public interface BackStackEntry { 65cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 66cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Return the unique identifier for the entry. This is the only 67cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * representation of the entry that will persist across activity 68cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * instances. 69cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 70cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int getId(); 71cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 72cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 73cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Return the full bread crumb title resource identifier for the entry, 74cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * or 0 if it does not have one. 75cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 76cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int getBreadCrumbTitleRes(); 77cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 78cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 79cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Return the short bread crumb title resource identifier for the entry, 80cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * or 0 if it does not have one. 81cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 82cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int getBreadCrumbShortTitleRes(); 83cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 84cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 85cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Return the full bread crumb title for the entry, or null if it 86cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * does not have one. 87cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 88cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public CharSequence getBreadCrumbTitle(); 89cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 90cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 91cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Return the short bread crumb title for the entry, or null if it 92cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * does not have one. 93cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 94cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public CharSequence getBreadCrumbShortTitle(); 95cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 96cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 97cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 98cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Interface to watch for changes to the back stack. 99cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 100cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public interface OnBackStackChangedListener { 101cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 102cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Called whenever the contents of the back stack change. 103cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 104cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void onBackStackChanged(); 105cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 106cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 107cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 108cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Start a series of edit operations on the Fragments associated with 109cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * this FragmentManager. 110cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 111cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * <p>Note: A fragment transaction can only be created/committed prior 112cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * to an activity saving its state. If you try to commit a transaction 113cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * after {@link FragmentActivity#onSaveInstanceState FragmentActivity.onSaveInstanceState()} 114cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * (and prior to a following {@link FragmentActivity#onStart FragmentActivity.onStart} 115cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * or {@link FragmentActivity#onResume FragmentActivity.onResume()}, you will get an error. 116cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * This is because the framework takes care of saving your current fragments 117cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * in the state, and if changes are made after the state is saved then they 118cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * will be lost.</p> 119cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 120cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract FragmentTransaction beginTransaction(); 121cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 122cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** @hide -- remove once prebuilts are in. */ 123cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Deprecated 124cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction openTransaction() { 125cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return beginTransaction(); 126cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 127cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 128cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 129cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * After a {@link FragmentTransaction} is committed with 130cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * {@link FragmentTransaction#commit FragmentTransaction.commit()}, it 131cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * is scheduled to be executed asynchronously on the process's main thread. 132cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * If you want to immediately executing any such pending operations, you 133cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * can call this function (only from the main thread) to do so. Note that 134cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * all callbacks and other related behavior will be done from within this 135cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * call, so be careful about where this is called from. 136cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 137cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @return Returns true if there were any pending transactions to be 138cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * executed. 139cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 140cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract boolean executePendingTransactions(); 141cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 142cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 143cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Finds a fragment that was identified by the given id either when inflated 144cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * from XML or as the container ID when added in a transaction. This first 145cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * searches through fragments that are currently added to the manager's 146cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * activity; if no such fragment is found, then all fragments currently 147cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * on the back stack associated with this ID are searched. 148cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @return The fragment if found or null otherwise. 149cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 150cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract Fragment findFragmentById(int id); 151cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 152cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 153cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Finds a fragment that was identified by the given tag either when inflated 154cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * from XML or as supplied when added in a transaction. This first 155cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * searches through fragments that are currently added to the manager's 156cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * activity; if no such fragment is found, then all fragments currently 157cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * on the back stack are searched. 158cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @return The fragment if found or null otherwise. 159cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 160cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract Fragment findFragmentByTag(String tag); 161cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 162cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 163cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Flag for {@link #popBackStack(String, int)} 164cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * and {@link #popBackStack(int, int)}: If set, and the name or ID of 165cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * a back stack entry has been supplied, then all matching entries will 166cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * be consumed until one that doesn't match is found or the bottom of 167cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * the stack is reached. Otherwise, all entries up to but not including that entry 168cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * will be removed. 169cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 170cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int POP_BACK_STACK_INCLUSIVE = 1<<0; 171cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 172cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 173cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Pop the top state off the back stack. Returns true if there was one 174cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * to pop, else false. This function is asynchronous -- it enqueues the 175cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * request to pop, but the action will not be performed until the application 176cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * returns to its event loop. 177cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 178cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract void popBackStack(); 179cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 180cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 181cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Like {@link #popBackStack()}, but performs the operation immediately 182cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * inside of the call. This is like calling {@link #executePendingTransactions()} 183cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * afterwards. 184cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @return Returns true if there was something popped, else false. 185cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 186cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract boolean popBackStackImmediate(); 187cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 188cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 189cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Pop the last fragment transition from the manager's fragment 190cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * back stack. If there is nothing to pop, false is returned. 191cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * This function is asynchronous -- it enqueues the 192cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * request to pop, but the action will not be performed until the application 193cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * returns to its event loop. 194cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 195cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param name If non-null, this is the name of a previous back state 196cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * to look for; if found, all states up to that state will be popped. The 197cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether 198cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * the named state itself is popped. If null, only the top state is popped. 199cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. 200cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 201cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract void popBackStack(String name, int flags); 202cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 203cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 204cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Like {@link #popBackStack(String, int)}, but performs the operation immediately 205cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * inside of the call. This is like calling {@link #executePendingTransactions()} 206cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * afterwards. 207cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @return Returns true if there was something popped, else false. 208cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 209cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract boolean popBackStackImmediate(String name, int flags); 210cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 211cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 212cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Pop all back stack states up to the one with the given identifier. 213cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * This function is asynchronous -- it enqueues the 214cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * request to pop, but the action will not be performed until the application 215cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * returns to its event loop. 216cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 217cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param id Identifier of the stated to be popped. If no identifier exists, 218cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * false is returned. 219cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * The identifier is the number returned by 220cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * {@link FragmentTransaction#commit() FragmentTransaction.commit()}. The 221cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether 222cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * the named state itself is popped. 223cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. 224cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 225cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract void popBackStack(int id, int flags); 226cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 227cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 228cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Like {@link #popBackStack(int, int)}, but performs the operation immediately 229cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * inside of the call. This is like calling {@link #executePendingTransactions()} 230cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * afterwards. 231cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @return Returns true if there was something popped, else false. 232cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 233cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract boolean popBackStackImmediate(int id, int flags); 234cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 235cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 236cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Return the number of entries currently in the back stack. 237cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 238cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract int getBackStackEntryCount(); 239cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 240cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 241cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Return the BackStackEntry at index <var>index</var> in the back stack; 242cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * entries start index 0 being the bottom of the stack. 243cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 244cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract BackStackEntry getBackStackEntryAt(int index); 245cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 246cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 247cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Add a new listener for changes to the fragment back stack. 248cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 249cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract void addOnBackStackChangedListener(OnBackStackChangedListener listener); 250cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 251cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 252cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Remove a listener that was previously added with 253cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * {@link #addOnBackStackChangedListener(OnBackStackChangedListener)}. 254cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 255cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract void removeOnBackStackChangedListener(OnBackStackChangedListener listener); 256cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 257cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 258cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Put a reference to a fragment in a Bundle. This Bundle can be 259cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * persisted as saved state, and when later restoring 260cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * {@link #getFragment(Bundle, String)} will return the current 261cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * instance of the same fragment. 262cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 263cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param bundle The bundle in which to put the fragment reference. 264cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param key The name of the entry in the bundle. 265cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param fragment The Fragment whose reference is to be stored. 266cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 267cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract void putFragment(Bundle bundle, String key, Fragment fragment); 268cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 269cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 270cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Retrieve the current Fragment instance for a reference previously 271cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * placed with {@link #putFragment(Bundle, String, Fragment)}. 272cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 273cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param bundle The bundle from which to retrieve the fragment reference. 274cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param key The name of the entry in the bundle. 275cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @return Returns the current Fragment instance that is associated with 276cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * the given reference. 277cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 278cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract Fragment getFragment(Bundle bundle, String key); 279cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 280cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 281cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Print the FragmentManager's state into the given stream. 282cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 283cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param prefix Text to print at the front of each line. 284cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param fd The raw file descriptor that the dump is being sent to. 285cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param writer A PrintWriter to which the dump is to be set. 286cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param args Additional arguments to the dump request. 287cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 288cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args); 289cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 290cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 291cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Control whether the framework's internal fragment manager debugging 292cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * logs are turned on. If enabled, you will see output in logcat as 293cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * the framework performs fragment operations. 294cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 295cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static void enableDebugLogging(boolean enabled) { 296cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentManagerImpl.DEBUG = enabled; 297cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 298cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn} 299cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 300cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornfinal class FragmentManagerState implements Parcelable { 301cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentState[] mActive; 302cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int[] mAdded; 303cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn BackStackState[] mBackStack; 304cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 305cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentManagerState() { 306cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 307cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 308cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentManagerState(Parcel in) { 309cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActive = in.createTypedArray(FragmentState.CREATOR); 310cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAdded = in.createIntArray(); 311cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStack = in.createTypedArray(BackStackState.CREATOR); 312cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 313cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 314cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int describeContents() { 315cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return 0; 316cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 317cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 318cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void writeToParcel(Parcel dest, int flags) { 319cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn dest.writeTypedArray(mActive, flags); 320cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn dest.writeIntArray(mAdded); 321cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn dest.writeTypedArray(mBackStack, flags); 322cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 323cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 324cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final Parcelable.Creator<FragmentManagerState> CREATOR 325cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn = new Parcelable.Creator<FragmentManagerState>() { 326cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentManagerState createFromParcel(Parcel in) { 327cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return new FragmentManagerState(in); 328cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 329cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 330cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentManagerState[] newArray(int size) { 331cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return new FragmentManagerState[size]; 332cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 333cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn }; 334cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn} 335cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 336cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn/** 337cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Container for fragments associated with an activity. 338cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 339cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornfinal class FragmentManagerImpl extends FragmentManager { 340cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static boolean DEBUG = false; 341cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static final String TAG = "FragmentManager"; 342cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 343cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state"; 344cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static final String TARGET_STATE_TAG = "android:target_state"; 345cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static final String VIEW_STATE_TAG = "android:view_state"; 346cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 347cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<Runnable> mPendingActions; 348cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Runnable[] mTmpActions; 349cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn boolean mExecutingActions; 350cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 351cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<Fragment> mActive; 352cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<Fragment> mAdded; 353cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<Integer> mAvailIndices; 354cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<BackStackRecord> mBackStack; 355cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<Fragment> mCreatedMenus; 356cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 357cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Must be accessed while locked. 358cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<BackStackRecord> mBackStackIndices; 359cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<Integer> mAvailBackStackIndices; 360cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 361cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<OnBackStackChangedListener> mBackStackChangeListeners; 362cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 363cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int mCurState = Fragment.INITIALIZING; 364cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentActivity mActivity; 365cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 366cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn boolean mNeedMenuInvalidate; 367cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn boolean mStateSaved; 368cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn boolean mDestroyed; 369cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn String mNoTransactionsBecause; 370cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 371cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Temporary vars for state save and restore. 372cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Bundle mStateBundle = null; 373cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn SparseArray<Parcelable> mStateArray = null; 374cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 375cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Runnable mExecCommit = new Runnable() { 376cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 377cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void run() { 378cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn execPendingActions(); 379cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 380cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn }; 381cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 382cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 383cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction beginTransaction() { 384cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return new BackStackRecord(this); 385cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 386cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 387cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 388cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public boolean executePendingTransactions() { 389cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return execPendingActions(); 390cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 391cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 392cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 393cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void popBackStack() { 394cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn enqueueAction(new Runnable() { 395cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override public void run() { 396cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn popBackStackState(mActivity.mHandler, null, -1, 0); 397cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 398cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn }, false); 399cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 400cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 401cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 402cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public boolean popBackStackImmediate() { 403cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn checkStateLoss(); 404cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn executePendingTransactions(); 405cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return popBackStackState(mActivity.mHandler, null, -1, 0); 406cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 407cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 408cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 409cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void popBackStack(final String name, final int flags) { 410cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn enqueueAction(new Runnable() { 411cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override public void run() { 412cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn popBackStackState(mActivity.mHandler, name, -1, flags); 413cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 414cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn }, false); 415cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 416cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 417cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 418cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public boolean popBackStackImmediate(String name, int flags) { 419cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn checkStateLoss(); 420cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn executePendingTransactions(); 421cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return popBackStackState(mActivity.mHandler, name, -1, flags); 422cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 423cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 424cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 425cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void popBackStack(final int id, final int flags) { 426cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (id < 0) { 427cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalArgumentException("Bad id: " + id); 428cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 429cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn enqueueAction(new Runnable() { 430cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override public void run() { 431cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn popBackStackState(mActivity.mHandler, null, id, flags); 432cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 433cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn }, false); 434cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 435cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 436cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 437cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public boolean popBackStackImmediate(int id, int flags) { 438cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn checkStateLoss(); 439cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn executePendingTransactions(); 440cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (id < 0) { 441cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalArgumentException("Bad id: " + id); 442cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 443cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return popBackStackState(mActivity.mHandler, null, id, flags); 444cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 445cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 446cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 447cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int getBackStackEntryCount() { 448cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mBackStack != null ? mBackStack.size() : 0; 449cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 450cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 451cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 452cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public BackStackEntry getBackStackEntryAt(int index) { 453cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mBackStack.get(index); 454cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 455cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 456cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 457cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void addOnBackStackChangedListener(OnBackStackChangedListener listener) { 458cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mBackStackChangeListeners == null) { 459cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStackChangeListeners = new ArrayList<OnBackStackChangedListener>(); 460cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 461cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStackChangeListeners.add(listener); 462cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 463cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 464cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 465cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void removeOnBackStackChangedListener(OnBackStackChangedListener listener) { 466cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mBackStackChangeListeners != null) { 467cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStackChangeListeners.remove(listener); 468cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 469cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 470cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 471cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 472cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void putFragment(Bundle bundle, String key, Fragment fragment) { 473cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragment.mIndex < 0) { 474cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException("Fragment " + fragment 475cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " is not currently in the FragmentManager"); 476cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 477cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bundle.putInt(key, fragment.mIndex); 478cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 479cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 480cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 481cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public Fragment getFragment(Bundle bundle, String key) { 482cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int index = bundle.getInt(key, -1); 483cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (index == -1) { 484cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return null; 485cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 486cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (index >= mActive.size()) { 487cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException("Fragement no longer exists for key " 488cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + key + ": index " + index); 489cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 490cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mActive.get(index); 491cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f == null) { 492cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException("Fragement no longer exists for key " 493cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + key + ": index " + index); 494cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 495cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return f; 496cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 497cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 498cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 499cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public String toString() { 500cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn StringBuilder sb = new StringBuilder(128); 501cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn sb.append("FragmentManager{"); 502cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(this))); 503cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn sb.append(" in "); 504cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn DebugUtils.buildShortClassTag(mActivity, sb); 505cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn sb.append("}}"); 506cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return sb.toString(); 507cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 508cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 509cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 510cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 511cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn String innerPrefix = prefix + " "; 512cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 513cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int N; 514cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null) { 515cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn N = mActive.size(); 516cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (N > 0) { 517cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.print("Active Fragments in "); 518cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(Integer.toHexString(System.identityHashCode(this))); 519cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.println(":"); 520cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<N; i++) { 521cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mActive.get(i); 522cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 523cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(": "); writer.println(f); 524cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null) { 525cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.dump(innerPrefix, fd, writer, args); 526cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 527cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 528cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 529cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 530cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 531cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAdded != null) { 532cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn N = mAdded.size(); 533cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (N > 0) { 534cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.println("Added Fragments:"); 535cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<N; i++) { 536cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mAdded.get(i); 537cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 538cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(": "); writer.println(f.toString()); 539cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 540cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 541cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 542cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 543cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mCreatedMenus != null) { 544cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn N = mCreatedMenus.size(); 545cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (N > 0) { 546cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.println("Fragments Created Menus:"); 547cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<N; i++) { 548cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mCreatedMenus.get(i); 549cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 550cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(": "); writer.println(f.toString()); 551cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 552cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 553cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 554cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 555cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mBackStack != null) { 556cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn N = mBackStack.size(); 557cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (N > 0) { 558cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.println("Back Stack:"); 559cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<N; i++) { 560cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn BackStackRecord bs = mBackStack.get(i); 561cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 562cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(": "); writer.println(bs.toString()); 563cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bs.dump(innerPrefix, fd, writer, args); 564cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 565cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 566cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 567cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 568cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn synchronized (this) { 569cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mBackStackIndices != null) { 570cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn N = mBackStackIndices.size(); 571cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (N > 0) { 572cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.println("Back Stack Indices:"); 573cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<N; i++) { 574cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn BackStackRecord bs = mBackStackIndices.get(i); 575cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 576cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(": "); writer.println(bs); 577cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 578cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 579cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 580cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 581cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAvailBackStackIndices != null && mAvailBackStackIndices.size() > 0) { 582cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.print("mAvailBackStackIndices: "); 583cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.println(Arrays.toString(mAvailBackStackIndices.toArray())); 584cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 585cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 586cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 587cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mPendingActions != null) { 588cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn N = mPendingActions.size(); 589cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (N > 0) { 590cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.println("Pending Actions:"); 591cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<N; i++) { 592cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Runnable r = mPendingActions.get(i); 593cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 594cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(": "); writer.println(r); 595cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 596cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 597cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 598cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 599cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.println("FragmentManager misc state:"); 600cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.print(" mCurState="); writer.print(mCurState); 601cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(" mStateSaved="); writer.print(mStateSaved); 602cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(" mDestroyed="); writer.println(mDestroyed); 603cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mNeedMenuInvalidate) { 604cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.print(" mNeedMenuInvalidate="); 605cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.println(mNeedMenuInvalidate); 606cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 607cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mNoTransactionsBecause != null) { 608cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.print(" mNoTransactionsBecause="); 609cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.println(mNoTransactionsBecause); 610cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 611cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAvailIndices != null && mAvailIndices.size() > 0) { 612cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.print(" mAvailIndices: "); 613cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.println(Arrays.toString(mAvailIndices.toArray())); 614cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 615cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 616cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 617cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Animation loadAnimator(Fragment fragment, int transit, boolean enter, 618cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int transitionStyle) { 619cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Animation animObj = fragment.onCreateAnimator(transit, enter, 620cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mNextAnim); 621cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (animObj != null) { 622cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return animObj; 623cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 624cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 625cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragment.mNextAnim != 0) { 626cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Animation anim = AnimationUtils.loadAnimation(mActivity, fragment.mNextAnim); 627cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (anim != null) { 628cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return anim; 629cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 630cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 631cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 632cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (transit == 0) { 633cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return null; 634cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 635cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 636cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int styleIndex = transitToStyleIndex(transit, enter); 637cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (styleIndex < 0) { 638cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return null; 639cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 640cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 641cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (transitionStyle == 0 && mActivity.getWindow() != null) { 642cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn transitionStyle = mActivity.getWindow().getAttributes().windowAnimations; 643cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 644cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (transitionStyle == 0) { 645cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return null; 646cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 647cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 648cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn //TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle, 649cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // com.android.internal.R.styleable.FragmentAnimation); 650cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn //int anim = attrs.getResourceId(styleIndex, 0); 651cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn //attrs.recycle(); 652cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 653cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn //if (anim == 0) { 654cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // return null; 655cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn //} 656cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 657cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn //return AnimatorInflater.loadAnimator(mActivity, anim); 658cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return null; 659cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 660cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 661cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn void moveToState(Fragment f, int newState, int transit, int transitionStyle) { 662cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Fragments that are not currently added will sit in the onCreate() state. 663cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mAdded && newState > Fragment.CREATED) { 664cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn newState = Fragment.CREATED; 665cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 666cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 667cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mState < newState) { 668cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mAnimatingAway != null) { 669cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // The fragment is currently being animated... but! Now we 670cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // want to move our state back up. Give up on waiting for the 671cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // animation, move to whatever the final state should be once 672cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // the animation is done, and then we can proceed from there. 673cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mAnimatingAway = null; 674cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(f, f.mStateAfterAnimating, 0, 0); 675cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 676cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn switch (f.mState) { 677cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case Fragment.INITIALIZING: 678cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto CREATED: " + f); 679cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mSavedFragmentState != null) { 680cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mSavedViewState = f.mSavedFragmentState.getSparseParcelableArray( 681cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG); 682cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mTarget = getFragment(f.mSavedFragmentState, 683cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentManagerImpl.TARGET_STATE_TAG); 684cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mTarget != null) { 685cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mTargetRequestCode = f.mSavedFragmentState.getInt( 686cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 0); 687cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 688cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 689cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mActivity = mActivity; 690cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mFragmentManager = mActivity.mFragments; 691cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mCalled = false; 692cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onAttach(mActivity); 693cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mCalled) { 694cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 695cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " did not call through to super.onAttach()"); 696cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 697cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActivity.onAttachFragment(f); 698cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 699cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mRetaining) { 700cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mCalled = false; 701cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onCreate(f.mSavedFragmentState); 702cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mCalled) { 703cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 704cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " did not call through to super.onCreate()"); 705cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 706cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 707cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mRetaining = false; 708cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mFromLayout) { 709cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // For fragments that are part of the content view 710cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // layout, we need to instantiate the view immediately 711cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // and the inflater will take care of adding it. 712cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState), 713cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn null, f.mSavedFragmentState); 714cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mView != null) { 715cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mInnerView = f.mView; 716cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mView = NoSaveStateFrameLayout.wrap(f.mView); 717cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.restoreViewState(); 718cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mHidden) f.mView.setVisibility(View.GONE); 719cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 720cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mInnerView = null; 721cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 722cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 723cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case Fragment.CREATED: 724cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (newState > Fragment.CREATED) { 725cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto CONTENT: " + f); 726cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mFromLayout) { 727cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ViewGroup container = null; 728cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mContainerId != 0) { 729cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn container = (ViewGroup)mActivity.findViewById(f.mContainerId); 730cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (container == null && !f.mRestored) { 731cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalArgumentException("No view found for id 0x" 732cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + Integer.toHexString(f.mContainerId) 733cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " for fragment " + f); 734cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 735cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 736cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mContainer = container; 737cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState), 738cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn container, f.mSavedFragmentState); 739cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mView != null) { 740cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mInnerView = f.mView; 741cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mView = NoSaveStateFrameLayout.wrap(f.mView); 742cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (container != null) { 743cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Animation anim = loadAnimator(f, transit, true, 744cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn transitionStyle); 745cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (anim != null) { 746cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mView.startAnimation(anim); 747cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 748cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn container.addView(f.mView); 749cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.restoreViewState(); 750cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 751cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mHidden) f.mView.setVisibility(View.GONE); 752cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 753cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mInnerView = null; 754cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 755cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 756cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 757cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mCalled = false; 758cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onActivityCreated(f.mSavedFragmentState); 759cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mCalled) { 760cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 761cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " did not call through to super.onActivityCreated()"); 762cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 763cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mSavedFragmentState = null; 764cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 765cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case Fragment.ACTIVITY_CREATED: 766cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (newState > Fragment.ACTIVITY_CREATED) { 767cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto STARTED: " + f); 768cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mCalled = false; 769cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onStart(); 770cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mCalled) { 771cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 772cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " did not call through to super.onStart()"); 773cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 774cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 775cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case Fragment.STARTED: 776cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (newState > Fragment.STARTED) { 777cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto RESUMED: " + f); 778cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mCalled = false; 779cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mResumed = true; 780cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onResume(); 781cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mCalled) { 782cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 783cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " did not call through to super.onResume()"); 784cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 785cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 786cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 787cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else if (f.mState > newState) { 788cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn switch (f.mState) { 789cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case Fragment.RESUMED: 790cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (newState < Fragment.RESUMED) { 791cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom RESUMED: " + f); 792cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mCalled = false; 793cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onPause(); 794cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mCalled) { 795cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 796cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " did not call through to super.onPause()"); 797cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 798cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mResumed = false; 799cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 800cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case Fragment.STARTED: 801cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (newState < Fragment.STARTED) { 802cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom STARTED: " + f); 803cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mCalled = false; 804cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.performStop(); 805cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mCalled) { 806cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 807cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " did not call through to super.onStop()"); 808cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 809cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 810cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case Fragment.ACTIVITY_CREATED: 811cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (newState < Fragment.ACTIVITY_CREATED) { 812cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom CONTENT: " + f); 813cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mView != null) { 814cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Need to save the current view state if not 815cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // done already. 816cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!mActivity.isFinishing() && f.mSavedViewState == null) { 817cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn saveFragmentViewState(f); 818cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 819cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 820cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mCalled = false; 821cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onDestroyView(); 822cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mCalled) { 823cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 824cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " did not call through to super.onDestroyView()"); 825cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 826cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mView != null && f.mContainer != null) { 827cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Animation anim = null; 828cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mCurState > Fragment.INITIALIZING && !mDestroyed) { 829cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn anim = loadAnimator(f, transit, false, 830cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn transitionStyle); 831cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 832cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (anim != null) { 833cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final Fragment fragment = f; 834cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mAnimatingAway = f.mView; 835cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mStateAfterAnimating = newState; 836cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn anim.setAnimationListener(new AnimationListener() { 837cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 838cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void onAnimationEnd(Animation animation) { 839cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragment.mAnimatingAway != null) { 840cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mAnimatingAway = null; 841cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(fragment, fragment.mStateAfterAnimating, 842cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 0, 0); 843cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 844cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 845cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 846cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void onAnimationRepeat(Animation animation) { 847cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 848cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn @Override 849cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void onAnimationStart(Animation animation) { 850cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 851cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn }); 852cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mContainer.startAnimation(anim); 853cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 854cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mContainer.removeView(f.mView); 855cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 856cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mContainer = null; 857cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mView = null; 858cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mInnerView = null; 859cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 860cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case Fragment.CREATED: 861cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (newState < Fragment.CREATED) { 862cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mDestroyed) { 863cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mAnimatingAway != null) { 864cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // The fragment's containing activity is 865cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // being destroyed, but this fragment is 866cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // currently animating away. Stop the 867cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // animation right now -- it is not needed, 868cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // and we can't wait any more on destroying 869cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // the fragment. 870cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn View v = f.mAnimatingAway; 871cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mAnimatingAway = null; 872cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn v.clearAnimation(); 873cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 874cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 875cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mAnimatingAway != null) { 876cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // We are waiting for the fragment's view to finish 877cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // animating away. Just make a note of the state 878cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // the fragment now should move to once the animation 879cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // is done. 880cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mStateAfterAnimating = newState; 881cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 882cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f); 883cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mRetaining) { 884cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mCalled = false; 885cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onDestroy(); 886cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mCalled) { 887cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 888cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " did not call through to super.onDestroy()"); 889cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 890cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 891cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 892cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mCalled = false; 893cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onDetach(); 894cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!f.mCalled) { 895cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 896cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " did not call through to super.onDetach()"); 897cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 898cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mImmediateActivity = null; 899cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mActivity = null; 900cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mFragmentManager = null; 901cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 902cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 903cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 904cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 905cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 906cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mState = newState; 907cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 908cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 909cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn void moveToState(Fragment f) { 910cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(f, mCurState, 0, 0); 911cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 912cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 913cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn void moveToState(int newState, boolean always) { 914cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(newState, 0, 0, always); 915cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 916cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 917cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn void moveToState(int newState, int transit, int transitStyle, boolean always) { 918cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActivity == null && newState != Fragment.INITIALIZING) { 919cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException("No activity"); 920cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 921cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 922cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!always && mCurState == newState) { 923cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return; 924cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 925cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 926cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mCurState = newState; 927cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null) { 928cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 929cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mActive.get(i); 930cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null) { 931cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(f, newState, transit, transitStyle); 932cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 933cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 934cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 935cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mNeedMenuInvalidate && mActivity != null) { 936cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActivity.invalidateOptionsMenu(); 937cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mNeedMenuInvalidate = false; 938cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 939cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 940cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 941cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 942cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn void makeActive(Fragment f) { 943cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mIndex >= 0) { 944cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return; 945cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 946cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 947cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAvailIndices == null || mAvailIndices.size() <= 0) { 948cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive == null) { 949cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActive = new ArrayList<Fragment>(); 950cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 951cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.setIndex(mActive.size()); 952cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActive.add(f); 953cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 954cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 955cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1)); 956cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActive.set(f.mIndex, f); 957cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 958cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 959cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 960cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn void makeInactive(Fragment f) { 961cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mIndex < 0) { 962cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return; 963cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 964cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 965cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "Freeing fragment index " + f.mIndex); 966cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActive.set(f.mIndex, null); 967cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAvailIndices == null) { 968cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 969cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 970cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAvailIndices.add(f.mIndex); 971cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActivity.invalidateFragmentIndex(f.mIndex); 972cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.clearIndex(); 973cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 974cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 975cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void addFragment(Fragment fragment, boolean moveToStateNow) { 976cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAdded == null) { 977cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAdded = new ArrayList<Fragment>(); 978cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 979cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAdded.add(fragment); 980cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn makeActive(fragment); 981cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "add: " + fragment); 982cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mAdded = true; 983cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mRemoving = false; 984cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragment.mHasMenu) { 985cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mNeedMenuInvalidate = true; 986cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 987cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (moveToStateNow) { 988cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(fragment); 989cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 990cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 991cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 992cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void removeFragment(Fragment fragment, int transition, int transitionStyle) { 993cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "remove: " + fragment + " nesting=" + fragment.mBackStackNesting); 994cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAdded.remove(fragment); 995cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final boolean inactive = fragment.mBackStackNesting <= 0; 996cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragment.mHasMenu) { 997cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mNeedMenuInvalidate = true; 998cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 999cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mAdded = false; 1000cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mRemoving = true; 1001cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED, 1002cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn transition, transitionStyle); 1003cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (inactive) { 1004cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn makeInactive(fragment); 1005cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1006cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1007cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1008cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void hideFragment(Fragment fragment, int transition, int transitionStyle) { 1009cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "hide: " + fragment); 1010cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!fragment.mHidden) { 1011cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mHidden = true; 1012cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragment.mView != null) { 1013cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Animation anim = loadAnimator(fragment, transition, true, 1014cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn transitionStyle); 1015cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (anim != null) { 1016cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mView.startAnimation(anim); 1017cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1018cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mView.setVisibility(View.GONE); 1019cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1020cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 1021cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mNeedMenuInvalidate = true; 1022cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1023cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.onHiddenChanged(true); 1024cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1025cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1026cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1027cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void showFragment(Fragment fragment, int transition, int transitionStyle) { 1028cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "show: " + fragment); 1029cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragment.mHidden) { 1030cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mHidden = false; 1031cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragment.mView != null) { 1032cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Animation anim = loadAnimator(fragment, transition, true, 1033cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn transitionStyle); 1034cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (anim != null) { 1035cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mView.startAnimation(anim); 1036cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1037cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mView.setVisibility(View.VISIBLE); 1038cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1039cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 1040cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mNeedMenuInvalidate = true; 1041cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1042cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.onHiddenChanged(false); 1043cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1044cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1045cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1046cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public Fragment findFragmentById(int id) { 1047cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null) { 1048cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // First look through added fragments. 1049cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 1050cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mAdded.get(i); 1051cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null && f.mFragmentId == id) { 1052cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return f; 1053cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1054cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1055cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Now for any known fragment. 1056cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 1057cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mActive.get(i); 1058cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null && f.mFragmentId == id) { 1059cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return f; 1060cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1061cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1062cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1063cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return null; 1064cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1065cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1066cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public Fragment findFragmentByTag(String tag) { 1067cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null && tag != null) { 1068cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // First look through added fragments. 1069cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 1070cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mAdded.get(i); 1071cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 1072cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return f; 1073cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1074cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1075cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Now for any known fragment. 1076cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 1077cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mActive.get(i); 1078cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 1079cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return f; 1080cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1081cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1082cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1083cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return null; 1084cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1085cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1086cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public Fragment findFragmentByWho(String who) { 1087cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null && who != null) { 1088cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 1089cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mActive.get(i); 1090cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null && who.equals(f.mWho)) { 1091cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return f; 1092cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1093cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1094cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1095cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return null; 1096cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1097cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1098cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private void checkStateLoss() { 1099cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mStateSaved) { 1100cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException( 1101cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn "Can not perform this action after onSaveInstanceState"); 1102cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1103cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mNoTransactionsBecause != null) { 1104cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException( 1105cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn "Can not perform this action inside of " + mNoTransactionsBecause); 1106cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1107cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1108cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1109cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void enqueueAction(Runnable action, boolean allowStateLoss) { 1110cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!allowStateLoss) { 1111cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn checkStateLoss(); 1112cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1113cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn synchronized (this) { 1114cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActivity == null) { 1115cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException("Activity has been destroyed"); 1116cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1117cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mPendingActions == null) { 1118cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mPendingActions = new ArrayList<Runnable>(); 1119cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1120cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mPendingActions.add(action); 1121cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mPendingActions.size() == 1) { 1122cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 1123cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActivity.mHandler.post(mExecCommit); 1124cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1125cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1126cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1127cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1128cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int allocBackStackIndex(BackStackRecord bse) { 1129cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn synchronized (this) { 1130cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAvailBackStackIndices == null || mAvailBackStackIndices.size() <= 0) { 1131cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mBackStackIndices == null) { 1132cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStackIndices = new ArrayList<BackStackRecord>(); 1133cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1134cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int index = mBackStackIndices.size(); 1135cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); 1136cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStackIndices.add(bse); 1137cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return index; 1138cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1139cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 1140cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int index = mAvailBackStackIndices.remove(mAvailBackStackIndices.size()-1); 1141cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); 1142cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStackIndices.set(index, bse); 1143cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return index; 1144cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1145cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1146cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1147cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1148cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void setBackStackIndex(int index, BackStackRecord bse) { 1149cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn synchronized (this) { 1150cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mBackStackIndices == null) { 1151cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStackIndices = new ArrayList<BackStackRecord>(); 1152cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1153cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int N = mBackStackIndices.size(); 1154cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (index < N) { 1155cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); 1156cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStackIndices.set(index, bse); 1157cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 1158cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn while (N < index) { 1159cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStackIndices.add(null); 1160cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAvailBackStackIndices == null) { 1161cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAvailBackStackIndices = new ArrayList<Integer>(); 1162cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1163cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding available back stack index " + N); 1164cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAvailBackStackIndices.add(N); 1165cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn N++; 1166cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1167cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); 1168cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStackIndices.add(bse); 1169cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1170cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1171cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1172cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1173cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void freeBackStackIndex(int index) { 1174cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn synchronized (this) { 1175cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStackIndices.set(index, null); 1176cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAvailBackStackIndices == null) { 1177cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAvailBackStackIndices = new ArrayList<Integer>(); 1178cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1179cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "Freeing back stack index " + index); 1180cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAvailBackStackIndices.add(index); 1181cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1182cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1183cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1184cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 1185cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Only call from main thread! 1186cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 1187cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public boolean execPendingActions() { 1188cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mExecutingActions) { 1189cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException("Recursive entry to executePendingTransactions"); 1190cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1191cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1192cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (Looper.myLooper() != mActivity.mHandler.getLooper()) { 1193cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException("Must be called from main thread of process"); 1194cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1195cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1196cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn boolean didSomething = false; 1197cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1198cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn while (true) { 1199cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int numActions; 1200cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1201cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn synchronized (this) { 1202cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mPendingActions == null || mPendingActions.size() == 0) { 1203cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return didSomething; 1204cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1205cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1206cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn numActions = mPendingActions.size(); 1207cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mTmpActions == null || mTmpActions.length < numActions) { 1208cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mTmpActions = new Runnable[numActions]; 1209cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1210cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mPendingActions.toArray(mTmpActions); 1211cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mPendingActions.clear(); 1212cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 1213cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1214cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1215cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mExecutingActions = true; 1216cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<numActions; i++) { 1217cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mTmpActions[i].run(); 1218cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1219cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mExecutingActions = false; 1220cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn didSomething = true; 1221cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1222cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1223cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1224cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn void reportBackStackChanged() { 1225cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mBackStackChangeListeners != null) { 1226cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<mBackStackChangeListeners.size(); i++) { 1227cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStackChangeListeners.get(i).onBackStackChanged(); 1228cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1229cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1230cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1231cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1232cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn void addBackStackState(BackStackRecord state) { 1233cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mBackStack == null) { 1234cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStack = new ArrayList<BackStackRecord>(); 1235cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1236cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStack.add(state); 1237cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn reportBackStackChanged(); 1238cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1239cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1240cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn boolean popBackStackState(Handler handler, String name, int id, int flags) { 1241cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mBackStack == null) { 1242cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return false; 1243cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1244cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (name == null && id < 0 && (flags&POP_BACK_STACK_INCLUSIVE) == 0) { 1245cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int last = mBackStack.size()-1; 1246cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (last < 0) { 1247cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return false; 1248cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1249cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final BackStackRecord bss = mBackStack.remove(last); 1250cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bss.popFromBackStack(true); 1251cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn reportBackStackChanged(); 1252cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 1253cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int index = -1; 1254cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (name != null || id >= 0) { 1255cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // If a name or ID is specified, look for that place in 1256cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // the stack. 1257cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn index = mBackStack.size()-1; 1258cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn while (index >= 0) { 1259cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn BackStackRecord bss = mBackStack.get(index); 1260cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (name != null && name.equals(bss.getName())) { 1261cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn break; 1262cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1263cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (id >= 0 && id == bss.mIndex) { 1264cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn break; 1265cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1266cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn index--; 1267cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1268cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (index < 0) { 1269cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return false; 1270cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1271cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if ((flags&POP_BACK_STACK_INCLUSIVE) != 0) { 1272cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn index--; 1273cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Consume all following entries that match. 1274cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn while (index >= 0) { 1275cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn BackStackRecord bss = mBackStack.get(index); 1276cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if ((name != null && name.equals(bss.getName())) 1277cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn || (id >= 0 && id == bss.mIndex)) { 1278cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn index--; 1279cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn continue; 1280cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1281cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn break; 1282cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1283cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1284cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1285cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (index == mBackStack.size()-1) { 1286cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return false; 1287cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1288cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final ArrayList<BackStackRecord> states 1289cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn = new ArrayList<BackStackRecord>(); 1290cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=mBackStack.size()-1; i>index; i--) { 1291cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn states.add(mBackStack.remove(i)); 1292cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1293cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final int LAST = states.size()-1; 1294cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<=LAST; i++) { 1295cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i)); 1296cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn states.get(i).popFromBackStack(i == LAST); 1297cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1298cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn reportBackStackChanged(); 1299cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1300cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return true; 1301cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1302cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1303cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<Fragment> retainNonConfig() { 1304cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<Fragment> fragments = null; 1305cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null) { 1306cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 1307cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mActive.get(i); 1308cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null && f.mRetainInstance) { 1309cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragments == null) { 1310cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragments = new ArrayList<Fragment>(); 1311cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1312cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragments.add(f); 1313cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mRetaining = true; 1314cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1315cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1316cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1317cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return fragments; 1318cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1319cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1320cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn void saveFragmentViewState(Fragment f) { 1321cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mInnerView == null) { 1322cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return; 1323cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1324cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mStateArray == null) { 1325cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mStateArray = new SparseArray<Parcelable>(); 1326cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1327cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mInnerView.saveHierarchyState(mStateArray); 1328cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mStateArray.size() > 0) { 1329cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mSavedViewState = mStateArray; 1330cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mStateArray = null; 1331cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1332cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1333cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1334cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Parcelable saveAllState() { 1335cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Make sure all pending operations have now been executed to get 1336cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // our state update-to-date. 1337cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn execPendingActions(); 1338cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1339cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mStateSaved = true; 1340cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1341cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive == null || mActive.size() <= 0) { 1342cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return null; 1343cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1344cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1345cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // First collect all active fragments. 1346cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int N = mActive.size(); 1347cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentState[] active = new FragmentState[N]; 1348cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn boolean haveFragments = false; 1349cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<N; i++) { 1350cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mActive.get(i); 1351cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null) { 1352cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn haveFragments = true; 1353cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1354cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentState fs = new FragmentState(f); 1355cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn active[i] = fs; 1356cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1357cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mState > Fragment.INITIALIZING && fs.mSavedFragmentState == null) { 1358cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mStateBundle == null) { 1359cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mStateBundle = new Bundle(); 1360cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1361cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onSaveInstanceState(mStateBundle); 1362cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!mStateBundle.isEmpty()) { 1363cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fs.mSavedFragmentState = mStateBundle; 1364cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mStateBundle = null; 1365cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1366cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1367cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mView != null) { 1368cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn saveFragmentViewState(f); 1369cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mSavedViewState != null) { 1370cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fs.mSavedFragmentState == null) { 1371cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fs.mSavedFragmentState = new Bundle(); 1372cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1373cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fs.mSavedFragmentState.putSparseParcelableArray( 1374cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState); 1375cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1376cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1377cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1378cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mTarget != null) { 1379cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mTarget.mIndex < 0) { 1380cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn String msg = "Failure saving state: " + f 1381cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " has target not in fragment manager: " + f.mTarget; 1382cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Log.e(TAG, msg); 1383cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn dump(" ", null, new PrintWriter(new LogWriter(TAG)), new String[] { }); 1384cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException(msg); 1385cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1386cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fs.mSavedFragmentState == null) { 1387cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fs.mSavedFragmentState = new Bundle(); 1388cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1389cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn putFragment(fs.mSavedFragmentState, 1390cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget); 1391cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mTargetRequestCode != 0) { 1392cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fs.mSavedFragmentState.putInt( 1393cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 1394cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mTargetRequestCode); 1395cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1396cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1397cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1398cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 1399cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fs.mSavedFragmentState = f.mSavedFragmentState; 1400cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1401cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1402cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "Saved state of " + f + ": " 1403cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + fs.mSavedFragmentState); 1404cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1405cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1406cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1407cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!haveFragments) { 1408cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: no fragments!"); 1409cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return null; 1410cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1411cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1412cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int[] added = null; 1413cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn BackStackState[] backStack = null; 1414cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1415cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Build list of currently added fragments. 1416cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAdded != null) { 1417cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn N = mAdded.size(); 1418cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (N > 0) { 1419cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn added = new int[N]; 1420cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<N; i++) { 1421cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn added[i] = mAdded.get(i).mIndex; 1422cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding fragment #" + i 1423cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + ": " + mAdded.get(i)); 1424cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1425cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1426cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1427cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1428cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Now save back stack. 1429cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mBackStack != null) { 1430cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn N = mBackStack.size(); 1431cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (N > 0) { 1432cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn backStack = new BackStackState[N]; 1433cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<N; i++) { 1434cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn backStack[i] = new BackStackState(this, mBackStack.get(i)); 1435cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding back stack #" + i 1436cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + ": " + mBackStack.get(i)); 1437cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1438cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1439cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1440cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1441cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentManagerState fms = new FragmentManagerState(); 1442cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fms.mActive = active; 1443cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fms.mAdded = added; 1444cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fms.mBackStack = backStack; 1445cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return fms; 1446cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1447cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1448cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) { 1449cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // If there is no saved state at all, then there can not be 1450cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // any nonConfig fragments either, so that is that. 1451cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (state == null) return; 1452cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentManagerState fms = (FragmentManagerState)state; 1453cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fms.mActive == null) return; 1454cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1455cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // First re-attach any non-config instances we are retaining back 1456cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // to their saved state, so we don't try to instantiate them again. 1457cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (nonConfig != null) { 1458cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 1459cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = nonConfig.get(i); 1460cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: re-attaching retained " + f); 1461cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentState fs = fms.mActive[f.mIndex]; 1462cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fs.mInstance = f; 1463cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mSavedViewState = null; 1464cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mBackStackNesting = 0; 1465cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mInLayout = false; 1466cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mAdded = false; 1467cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fs.mSavedFragmentState != null) { 1468cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fs.mSavedFragmentState.setClassLoader(mActivity.getClassLoader()); 1469cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray( 1470cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG); 1471cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1472cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1473cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1474cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1475cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Build the full list of active fragments, instantiating them from 1476cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // their saved state. 1477cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActive = new ArrayList<Fragment>(fms.mActive.length); 1478cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAvailIndices != null) { 1479cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAvailIndices.clear(); 1480cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1481cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<fms.mActive.length; i++) { 1482cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentState fs = fms.mActive[i]; 1483cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fs != null) { 1484cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = fs.instantiate(mActivity); 1485cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": " + f); 1486cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActive.add(f); 1487cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Now that the fragment is instantiated (or came from being 1488cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // retained above), clear mInstance in case we end up re-restoring 1489cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // from this FragmentState again. 1490cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fs.mInstance = null; 1491cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 1492cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": (null)"); 1493cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActive.add(null); 1494cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAvailIndices == null) { 1495cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 1496cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1497cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding avail #" + i); 1498cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAvailIndices.add(i); 1499cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1500cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1501cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1502cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Update the target of all retained fragments. 1503cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (nonConfig != null) { 1504cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 1505cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = nonConfig.get(i); 1506cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mTarget != null) { 1507cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.mTarget.mIndex < mActive.size()) { 1508cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mTarget = mActive.get(f.mTarget.mIndex); 1509cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 1510cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Log.w(TAG, "Re-attaching retained fragment " + f 1511cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " target no longer exists: " + f.mTarget); 1512cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mTarget = null; 1513cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1514cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1515cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1516cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1517cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1518cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Build the list of currently added fragments. 1519cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fms.mAdded != null) { 1520cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAdded = new ArrayList<Fragment>(fms.mAdded.length); 1521cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<fms.mAdded.length; i++) { 1522cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mActive.get(fms.mAdded[i]); 1523cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f == null) { 1524cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException( 1525cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn "No instantiated fragment for index #" + fms.mAdded[i]); 1526cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1527cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mAdded = true; 1528cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.mImmediateActivity = mActivity; 1529cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: making added #" + i + ": " + f); 1530cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAdded.add(f); 1531cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1532cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 1533cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAdded = null; 1534cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1535cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1536cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Build the back stack. 1537cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fms.mBackStack != null) { 1538cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStack = new ArrayList<BackStackRecord>(fms.mBackStack.length); 1539cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<fms.mBackStack.length; i++) { 1540cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn BackStackRecord bse = fms.mBackStack[i].instantiate(this); 1541cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding bse #" + i 1542cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " (index " + bse.mIndex + "): " + bse); 1543cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStack.add(bse); 1544cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (bse.mIndex >= 0) { 1545cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn setBackStackIndex(bse.mIndex, bse); 1546cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1547cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1548cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 1549cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBackStack = null; 1550cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1551cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1552cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1553cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void attachActivity(FragmentActivity activity) { 1554cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActivity != null) throw new IllegalStateException(); 1555cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActivity = activity; 1556cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1557cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1558cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void noteStateNotSaved() { 1559cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mStateSaved = false; 1560cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1561cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1562cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void dispatchCreate() { 1563cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mStateSaved = false; 1564cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(Fragment.CREATED, false); 1565cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1566cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1567cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void dispatchActivityCreated() { 1568cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mStateSaved = false; 1569cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 1570cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1571cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1572cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void dispatchStart() { 1573cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mStateSaved = false; 1574cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(Fragment.STARTED, false); 1575cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1576cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1577cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void dispatchResume() { 1578cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mStateSaved = false; 1579cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(Fragment.RESUMED, false); 1580cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1581cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1582cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void dispatchPause() { 1583cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(Fragment.STARTED, false); 1584cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1585cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1586cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void dispatchStop() { 1587cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 1588cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1589cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1590cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void dispatchDestroy() { 1591cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mDestroyed = true; 1592cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn moveToState(Fragment.INITIALIZING, false); 1593cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mActivity = null; 1594cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1595cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1596cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void dispatchConfigurationChanged(Configuration newConfig) { 1597cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null) { 1598cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1599cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mAdded.get(i); 1600cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null) { 1601cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onConfigurationChanged(newConfig); 1602cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1603cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1604cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1605cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1606cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1607cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void dispatchLowMemory() { 1608cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null) { 1609cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1610cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mAdded.get(i); 1611cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null) { 1612cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onLowMemory(); 1613cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1614cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1615cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1616cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1617cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1618cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1619cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn boolean show = false; 1620cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<Fragment> newMenus = null; 1621cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null) { 1622cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1623cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mAdded.get(i); 1624cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1625cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn show = true; 1626cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onCreateOptionsMenu(menu, inflater); 1627cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (newMenus == null) { 1628cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn newMenus = new ArrayList<Fragment>(); 1629cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1630cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn newMenus.add(f); 1631cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1632cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1633cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1634cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1635cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mCreatedMenus != null) { 1636cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<mCreatedMenus.size(); i++) { 1637cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mCreatedMenus.get(i); 1638cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (newMenus == null || !newMenus.contains(f)) { 1639cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onDestroyOptionsMenu(); 1640cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1641cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1642cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1643cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1644cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mCreatedMenus = newMenus; 1645cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1646cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return show; 1647cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1648cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1649cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public boolean dispatchPrepareOptionsMenu(Menu menu) { 1650cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn boolean show = false; 1651cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null) { 1652cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1653cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mAdded.get(i); 1654cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1655cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn show = true; 1656cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onPrepareOptionsMenu(menu); 1657cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1658cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1659cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1660cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return show; 1661cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1662cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1663cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public boolean dispatchOptionsItemSelected(MenuItem item) { 1664cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null) { 1665cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1666cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mAdded.get(i); 1667cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1668cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.onOptionsItemSelected(item)) { 1669cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return true; 1670cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1671cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1672cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1673cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1674cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return false; 1675cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1676cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1677cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public boolean dispatchContextItemSelected(MenuItem item) { 1678cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null) { 1679cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1680cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mAdded.get(i); 1681cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null && !f.mHidden) { 1682cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f.onContextItemSelected(item)) { 1683cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return true; 1684cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1685cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1686cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1687cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1688cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return false; 1689cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1690cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1691cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void dispatchOptionsMenuClosed(Menu menu) { 1692cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mActive != null) { 1693cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1694cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = mAdded.get(i); 1695cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1696cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn f.onOptionsMenuClosed(menu); 1697cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1698cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1699cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1700cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1701cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1702cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static int reverseTransit(int transit) { 1703cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int rev = 0; 1704cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn switch (transit) { 1705cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1706cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn rev = FragmentTransaction.TRANSIT_FRAGMENT_CLOSE; 1707cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn break; 1708cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1709cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn rev = FragmentTransaction.TRANSIT_FRAGMENT_OPEN; 1710cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn break; 1711cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case FragmentTransaction.TRANSIT_FRAGMENT_FADE: 1712cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn rev = FragmentTransaction.TRANSIT_FRAGMENT_FADE; 1713cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn break; 1714cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1715cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return rev; 1716cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1717cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1718cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1719cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static int transitToStyleIndex(int transit, boolean enter) { 1720cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int animAttr = -1; 1721cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn switch (transit) { 1722cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1723cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn animAttr = enter 1724cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ? 0 //com.android.internal.R.styleable.FragmentAnimation_fragmentOpenEnterAnimation 1725cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn : 0; //com.android.internal.R.styleable.FragmentAnimation_fragmentOpenExitAnimation; 1726cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn break; 1727cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1728cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn animAttr = enter 1729cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ? 0 //com.android.internal.R.styleable.FragmentAnimation_fragmentCloseEnterAnimation 1730cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn : 0; //com.android.internal.R.styleable.FragmentAnimation_fragmentCloseExitAnimation; 1731cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn break; 1732cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case FragmentTransaction.TRANSIT_FRAGMENT_FADE: 1733cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn animAttr = enter 1734cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ? 0 //com.android.internal.R.styleable.FragmentAnimation_fragmentFadeEnterAnimation 1735cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn : 0; //com.android.internal.R.styleable.FragmentAnimation_fragmentFadeExitAnimation; 1736cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn break; 1737cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1738cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return animAttr; 1739cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1740cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn} 1741