FragmentManager.java revision 2707d6026240bcca6f0e35e2e1138958882e90ce
12dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/* 22dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Copyright (C) 2010 The Android Open Source Project 32dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * 42dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 52dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * you may not use this file except in compliance with the License. 62dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * You may obtain a copy of the License at 72dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * 82dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 92dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * 102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Unless required by applicable law or agreed to in writing, software 112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * See the License for the specific language governing permissions and 142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * limitations under the License. 152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */ 162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornpackage android.app; 182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 19f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.content.res.TypedArray; 202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.os.Bundle; 21ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackbornimport android.os.Handler; 22b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcel; 23b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcelable; 245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.util.Log; 25b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.util.SparseArray; 26b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.Menu; 27b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuInflater; 28b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuItem; 295ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.view.View; 302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.view.ViewGroup; 31f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.view.animation.Animation; 32f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.view.animation.AnimationUtils; 332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport java.util.ArrayList; 352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 36b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class FragmentManagerState implements Parcelable { 376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState[] mActive; 38b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn int[] mAdded; 39b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackState[] mBackStack; 40b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 41b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState() { 42b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 43b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 44b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState(Parcel in) { 456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = in.createTypedArray(FragmentState.CREATOR); 46b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mAdded = in.createIntArray(); 47b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack = in.createTypedArray(BackStackState.CREATOR); 48b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 49b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 50b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public int describeContents() { 51b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return 0; 52b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 53b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 54b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void writeToParcel(Parcel dest, int flags) { 556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn dest.writeTypedArray(mActive, flags); 56b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn dest.writeIntArray(mAdded); 57b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn dest.writeTypedArray(mBackStack, flags); 58b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 59b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 60b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public static final Parcelable.Creator<FragmentManagerState> CREATOR 61b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn = new Parcelable.Creator<FragmentManagerState>() { 62b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState createFromParcel(Parcel in) { 63b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return new FragmentManagerState(in); 64b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 65b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 66b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState[] newArray(int size) { 67b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return new FragmentManagerState[size]; 68b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 69b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn }; 70ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn} 71ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/** 73f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn * @hide 742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Container for fragments associated with an activity. 752dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */ 76f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornpublic class FragmentManager { 775ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final boolean DEBUG = true; 785ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final String TAG = "FragmentManager"; 795ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 80445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn ArrayList<Runnable> mPendingActions; 81445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn Runnable[] mTmpActions; 82445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn boolean mExecutingActions; 83445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Fragment> mActive; 856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Fragment> mAdded; 866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Integer> mAvailIndices; 87b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<BackStackEntry> mBackStack; 882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn int mCurState = Fragment.INITIALIZING; 902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn Activity mActivity; 912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 92b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean mNeedMenuInvalidate; 93b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 94b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Temporary vars for state save and restore. 95b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Bundle mStateBundle = null; 96b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn SparseArray<Parcelable> mStateArray = null; 97b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 98445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn Runnable mExecCommit = new Runnable() { 99445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn @Override 100445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void run() { 101445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn execPendingActions(); 102445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 103445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn }; 104445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 105f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn Animation loadAnimation(Fragment fragment, int transit, boolean enter, 106f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int transitionStyle) { 1075ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Animation animObj = fragment.onCreateAnimation(transitionStyle, enter, 1085ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mNextAnim); 109f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (animObj != null) { 110f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return animObj; 111f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 112f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1135ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mNextAnim != 0) { 1145ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Animation anim = AnimationUtils.loadAnimation(mActivity, fragment.mNextAnim); 1155ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 1165ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return anim; 1175ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 1185ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 1195ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 120f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transit == 0) { 121f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 122f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 123f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 124f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int styleIndex = transitToStyleIndex(transit, enter); 125f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (styleIndex < 0) { 126f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 127f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 128f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 129f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transitionStyle == 0 && mActivity.getWindow() != null) { 130f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn transitionStyle = mActivity.getWindow().getAttributes().windowAnimations; 131f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 132f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transitionStyle == 0) { 133f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 134f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 135f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 136f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle, 137f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn com.android.internal.R.styleable.WindowAnimation); 138f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int anim = attrs.getResourceId(styleIndex, 0); 139f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn attrs.recycle(); 140f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 141f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (anim == 0) { 142f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 143f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 144f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 145f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return AnimationUtils.loadAnimation(mActivity, anim); 146f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 147f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 148f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn void moveToState(Fragment f, int newState, int transit, int transitionStyle) { 1496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Fragments that are not currently added will sit in the onCreate() state. 1506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!f.mAdded && newState > Fragment.CREATED) { 1516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn newState = Fragment.CREATED; 1526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 1536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 1542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (f.mState < newState) { 1552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn switch (f.mState) { 1562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.INITIALIZING: 1575ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto CREATED: " + f); 1582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mActivity = mActivity; 1592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 1602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onAttach(mActivity); 1612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 1622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 1632dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onAttach()"); 1642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 165c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn mActivity.onAttachFragment(f); 1662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 167b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mRetaining) { 168b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 169b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.onCreate(f.mSavedFragmentState); 170b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 171b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 172b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onCreate()"); 1732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 175b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mRetaining = false; 176b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mFromLayout) { 177b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // For fragments that are part of the content view 178b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // layout, we need to instantiate the view immediately 179b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // and the inflater will take care of adding it. 180b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView = f.onCreateView(mActivity.getLayoutInflater(), 181b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn null, f.mSavedFragmentState); 1826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView != null) { 1836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mView.setSaveFromParentEnabled(false); 1846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.restoreViewState(); 1855ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f.mHidden) f.mView.setVisibility(View.GONE); 1866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 187b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn case Fragment.CREATED: 1896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (newState > Fragment.CREATED) { 1905ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto CONTENT: " + f); 191b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mFromLayout) { 192b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ViewGroup container = null; 193b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mContainerId != 0) { 194b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container = (ViewGroup)mActivity.findViewById(f.mContainerId); 195b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (container == null) { 196b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new IllegalArgumentException("New view found for id 0x" 197b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + Integer.toHexString(f.mContainerId) 198b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " for fragment " + f); 199b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 200b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 201b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mContainer = container; 202b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView = f.onCreateView(mActivity.getLayoutInflater(), 203b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container, f.mSavedFragmentState); 204b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mView != null) { 205b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.setSaveFromParentEnabled(false); 206b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (container != null) { 207b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Animation anim = loadAnimation(f, transit, true, 208b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn transitionStyle); 209b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (anim != null) { 210b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.setAnimation(anim); 211b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 212b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container.addView(f.mView); 213b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.restoreViewState(); 214b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 2155ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f.mHidden) f.mView.setVisibility(View.GONE); 216b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 217b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 218b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 219b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 220c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn f.onActivityCreated(f.mSavedFragmentState); 221b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 222b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 223b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onReady()"); 224f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 225b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedFragmentState = null; 2262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 227c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn case Fragment.ACTIVITY_CREATED: 228c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn if (newState > Fragment.ACTIVITY_CREATED) { 2295ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto STARTED: " + f); 2302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 2312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onStart(); 2322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 2332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 2342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onStart()"); 2352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 2362dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 2372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.STARTED: 2382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState > Fragment.STARTED) { 2395ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto RESUMED: " + f); 2402dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 2412707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.mResumed = true; 2422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onResume(); 2432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 2442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 2452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onResume()"); 2462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 2472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 2482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 2492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } else if (f.mState > newState) { 2502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn switch (f.mState) { 2512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.RESUMED: 2522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.RESUMED) { 2535ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom RESUMED: " + f); 2542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 2552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onPause(); 2562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 2572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 2582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onPause()"); 2592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 2602707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.mResumed = false; 2612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 2622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.STARTED: 2632dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.STARTED) { 2645ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom STARTED: " + f); 2652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 2662707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.performStop(); 2672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 2682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 2692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onStop()"); 2702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 2712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 272c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn case Fragment.ACTIVITY_CREATED: 273c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn if (newState < Fragment.ACTIVITY_CREATED) { 2745ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom CONTENT: " + f); 275b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mView != null) { 2765ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn f.mCalled = false; 2775ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn f.onDestroyView(); 2785ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (!f.mCalled) { 2795ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 2805ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn + " did not call through to super.onDestroyedView()"); 2815ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 282b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Need to save the current view state if not 283b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // done already. 2846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!mActivity.isFinishing() && f.mSavedFragmentState == null) { 285b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn saveFragmentViewState(f); 286b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 287b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mContainer != null) { 288b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mCurState > Fragment.INITIALIZING) { 289b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Animation anim = loadAnimation(f, transit, false, 290b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn transitionStyle); 291b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (anim != null) { 292b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.setAnimation(anim); 293b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 294b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 295b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mContainer.removeView(f.mView); 296f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 2972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 2982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mContainer = null; 2992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mView = null; 300b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 301b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn case Fragment.CREATED: 302b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (newState < Fragment.CREATED) { 3035ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f); 304b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mRetaining) { 305b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 306b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.onDestroy(); 307b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 308b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 309b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onDestroy()"); 310b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 3112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 312b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 3132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 3142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onDetach(); 3152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 3162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 3172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onDetach()"); 3182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mActivity = null; 3202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3212dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 3242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mState = newState; 3252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 327ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn void moveToState(int newState, boolean always) { 328f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(newState, 0, 0, always); 329f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 330f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 331f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn void moveToState(int newState, int transit, int transitStyle, boolean always) { 3322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity == null && newState != Fragment.INITIALIZING) { 3332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new IllegalStateException("No activity"); 3342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 336ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (!always && mCurState == newState) { 337ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return; 338ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 339ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 3402dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mCurState = newState; 3416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 3426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 3436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 3446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null) { 3456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn moveToState(f, newState, transit, transitStyle); 3466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 3476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 3486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 3496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 3506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 3516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn void makeActive(Fragment f) { 3526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mIndex >= 0) { 3536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return; 3546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 3556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 3566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null || mAvailIndices.size() <= 0) { 3576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null) { 3586e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(); 359ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 3606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.setIndex(mActive.size()); 3616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(f); 3626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 3636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 3646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1)); 3656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.set(f.mIndex, f); 3662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 3696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn void makeInactive(Fragment f) { 3706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mIndex < 0) { 3716e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return; 3726e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 3736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 3746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.set(f.mIndex, null); 3756e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 3766e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 3776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 3786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(f.mIndex); 3796e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.clearIndex(); 3806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 3816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 382ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn public void addFragment(Fragment fragment, boolean moveToStateNow) { 3835ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "add: " + fragment); 3846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAdded == null) { 3856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(); 386ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 3876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(fragment); 3886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn makeActive(fragment); 3896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fragment.mAdded = true; 390b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mHasMenu) { 391b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 392b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 393ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (moveToStateNow) { 394f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(fragment, mCurState, 0, 0); 395ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 3962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 398f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void removeFragment(Fragment fragment, int transition, int transitionStyle) { 3995ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "remove: " + fragment); 4006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.remove(fragment); 4016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn final boolean inactive = fragment.mBackStackNesting <= 0; 4026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (inactive) { 4036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn makeInactive(fragment); 4046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 405b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mHasMenu) { 406b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 407b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 4086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fragment.mAdded = false; 4096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED, 4106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn transition, transitionStyle); 411f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 412f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 4135ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public void hideFragment(Fragment fragment, int transition, int transitionStyle) { 4145ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "hide: " + fragment); 4155ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (!fragment.mHidden) { 4165ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mHidden = true; 4175ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mView != null) { 4185ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Animation anim = loadAnimation(fragment, transition, false, 4195ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn transitionStyle); 4205ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 4215ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setAnimation(anim); 4225ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4235ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setVisibility(View.GONE); 4245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 425b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 426b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 427b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 4285ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.onHiddenChanged(true); 4295ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4305ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4315ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 4325ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public void showFragment(Fragment fragment, int transition, int transitionStyle) { 4335ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "show: " + fragment); 4345ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mHidden) { 4355ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mHidden = false; 4365ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mView != null) { 4375ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Animation anim = loadAnimation(fragment, transition, true, 4385ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn transitionStyle); 4395ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 4405ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setAnimation(anim); 4415ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4425ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setVisibility(View.VISIBLE); 4435ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 444b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 445b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 446b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 4475ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.onHiddenChanged(false); 4485ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4495ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4505ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 451f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public Fragment findFragmentById(int id) { 4526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 4535ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // First look through added fragments. 4545ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 4555ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment f = mAdded.get(i); 4565ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f != null && f.mFragmentId == id) { 4575ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return f; 4585ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4595ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4605ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // Now for any known fragment. 4616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 4626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 4636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && f.mFragmentId == id) { 464b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return f; 465b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 466b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 467b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 468b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 469b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 470b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 471b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public Fragment findFragmentByTag(String tag) { 4726e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null && tag != null) { 4735ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // First look through added fragments. 4745ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 4755ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment f = mAdded.get(i); 4765ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 4775ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return f; 4785ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4795ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4805ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // Now for any known fragment. 4816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 4826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 4836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 4846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return f; 4856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 4866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 4876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 4886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 4896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 4906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 4916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn public Fragment findFragmentByWho(String who) { 4926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null && who != null) { 4936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 4946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 4956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && who.equals(f.mWho)) { 496f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return f; 497f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 498f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 499f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 500f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 5012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 503445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void enqueueAction(Runnable action) { 504445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn synchronized (this) { 505445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions == null) { 506445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions = new ArrayList<Runnable>(); 507445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 508445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.add(action); 509445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions.size() == 1) { 510445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 511445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.post(mExecCommit); 512445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 513445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 514445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 515445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 516445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn /** 517445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn * Only call from main thread! 518445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn */ 519445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void execPendingActions() { 520445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mExecutingActions) { 521445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn throw new IllegalStateException("Recursive entry to execPendingActions"); 522445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 523445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 524445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn while (true) { 525445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn int numActions; 526445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 527445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn synchronized (this) { 528445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions == null || mPendingActions.size() == 0) { 529445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn return; 530445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 531445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 532445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn numActions = mPendingActions.size(); 533445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mTmpActions == null || mTmpActions.length < numActions) { 534445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mTmpActions = new Runnable[numActions]; 535445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 536445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.toArray(mTmpActions); 537445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.clear(); 538445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 539445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 540445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 541445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mExecutingActions = true; 542445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn for (int i=0; i<numActions; i++) { 543445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mTmpActions[i].run(); 544445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 545445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mExecutingActions = false; 546445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 547445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 548445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 549b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void addBackStackState(BackStackEntry state) { 550ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (mBackStack == null) { 551b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack = new ArrayList<BackStackEntry>(); 552ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 553ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn mBackStack.add(state); 554ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 555ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 556f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public boolean popBackStackState(Handler handler, String name) { 557ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (mBackStack == null) { 558ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return false; 559ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 560f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (name == null) { 561f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int last = mBackStack.size()-1; 562f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (last < 0) { 563f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return false; 564f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 565b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn final BackStackEntry bss = mBackStack.remove(last); 566445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn enqueueAction(new Runnable() { 567f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void run() { 568445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + bss); 569f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn bss.popFromBackStack(); 570f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(mCurState, reverseTransit(bss.getTransition()), 571f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn bss.getTransitionStyle(), true); 572f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 573f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn }); 574f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } else { 575f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int index = mBackStack.size()-1; 576f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn while (index >= 0) { 577b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackEntry bss = mBackStack.get(index); 578f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (name.equals(bss.getName())) { 579f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 580f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 581f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 582f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (index < 0 || index == mBackStack.size()-1) { 583f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return false; 584f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 585b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn final ArrayList<BackStackEntry> states 586b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn = new ArrayList<BackStackEntry>(); 587f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn for (int i=mBackStack.size()-1; i>index; i--) { 588f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn states.add(mBackStack.remove(i)); 589ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 590445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn enqueueAction(new Runnable() { 591f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void run() { 592f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn for (int i=0; i<states.size(); i++) { 593445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i)); 594f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn states.get(i).popFromBackStack(); 595f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 596f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(mCurState, true); 597f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 598f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn }); 599f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 600ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return true; 601ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 602ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 603b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<Fragment> retainNonConfig() { 604b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<Fragment> fragments = null; 6056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 6066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 6076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && f.mRetainInstance) { 609b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fragments == null) { 610b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fragments = new ArrayList<Fragment>(); 611b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 612b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fragments.add(f); 613b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mRetaining = true; 614b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 615b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 616b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 617b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fragments; 618b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 619b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 620b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void saveFragmentViewState(Fragment f) { 6216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView == null) { 622b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return; 623b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 624b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mStateArray == null) { 625b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mStateArray = new SparseArray<Parcelable>(); 626b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 627b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.saveHierarchyState(mStateArray); 628b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mStateArray.size() > 0) { 629b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = mStateArray; 630b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mStateArray = null; 631b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 632b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 633b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 6346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Parcelable saveAllState() { 6356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null || mActive.size() <= 0) { 6366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 637b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 638b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 6396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First collect all active fragments. 6406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn int N = mActive.size(); 6416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState[] active = new FragmentState[N]; 6426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn boolean haveFragments = false; 6436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<N; i++) { 6446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null) { 6466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn haveFragments = true; 6476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 6486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = new FragmentState(f); 6496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn active[i] = fs; 6506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 6516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mStateBundle == null) { 6526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mStateBundle = new Bundle(); 6536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.onSaveInstanceState(mStateBundle); 6556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!mStateBundle.isEmpty()) { 6566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState = mStateBundle; 6576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mStateBundle = null; 658b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 6596e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 6606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView != null) { 6616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn saveFragmentViewState(f); 6626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mSavedViewState != null) { 6636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs.mSavedFragmentState == null) { 6646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState = new Bundle(); 6656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState.putSparseParcelableArray( 6676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState.VIEW_STATE_TAG, f.mSavedViewState); 6686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 671b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 672b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 673b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 6746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!haveFragments) { 675b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 676b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 677b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 678b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn int[] added = null; 679b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackState[] backStack = null; 680b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 6816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build list of currently added fragments. 6826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn N = mAdded.size(); 683b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (N > 0) { 684b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn added = new int[N]; 685b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<N; i++) { 6866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn added[i] = mAdded.get(i).mIndex; 687b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 688b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 689b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 690b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Now save back stack. 691b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mBackStack != null) { 692b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn N = mBackStack.size(); 693b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (N > 0) { 694b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack = new BackStackState[N]; 695b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<N; i++) { 696b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack[i] = new BackStackState(this, mBackStack.get(i)); 697b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 698b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 699b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 700b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 701b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = new FragmentManagerState(); 7026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fms.mActive = active; 703b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mAdded = added; 704b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mBackStack = backStack; 705b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fms; 706b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 707b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 708b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) { 709b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // If there is no saved state at all, then there can not be 710b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // any nonConfig fragments either, so that is that. 711b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (state == null) return; 712b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = (FragmentManagerState)state; 7136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mActive == null) return; 714b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 7156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First re-attach any non-config instances we are retaining back 7166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // to their saved state, so we don't try to instantiate them again. 717b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (nonConfig != null) { 718b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 719b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Fragment f = nonConfig.get(i); 7206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[f.mIndex]; 721b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fs.mInstance = f; 722b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = null; 7236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mBackStackNesting = 0; 7246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = false; 725b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fs.mSavedFragmentState != null) { 726b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray( 727b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentState.VIEW_STATE_TAG); 728b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 729b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 730b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 731b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 7326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the full list of active fragments, instantiating them from 7336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // their saved state. 7346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(fms.mActive.length); 7356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices != null) { 7366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.clear(); 7376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 7386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<fms.mActive.length; i++) { 7396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[i]; 7406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs != null) { 7416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(fs.instantiate(mActivity)); 7426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 7436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(null); 7446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 7456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 7466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 7476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(i); 748b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 7496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 7506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 7516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the list of currently added fragments. 7526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mAdded != null) { 7536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(fms.mAdded.length); 754b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mAdded.length; i++) { 7556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(fms.mAdded[i]); 7566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f == null) { 7576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn throw new IllegalStateException( 7586e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn "No instantiated fragment for index #" + fms.mAdded[i]); 759b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 7606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = true; 761b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.mImmediateActivity = mActivity; 7626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(f); 763b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 7646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 7656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = null; 766b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 7676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 7686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the back stack. 769b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fms.mBackStack != null) { 770b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack = new ArrayList<BackStackEntry>(fms.mBackStack.length); 771b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mBackStack.length; i++) { 772b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackEntry bse = fms.mBackStack[i].instantiate(this); 773b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack.add(bse); 774b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 7756e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 7766e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mBackStack = null; 777b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 778b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 779b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 7802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void attachActivity(Activity activity) { 7812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity != null) throw new IllegalStateException(); 7822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = activity; 7832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 7842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 785b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void dispatchCreate() { 786ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.CREATED, false); 7872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 7882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 789c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn public void dispatchActivityCreated() { 790c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 791c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn } 792c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn 7932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStart() { 794ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 7952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 7962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 7972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchResume() { 798ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.RESUMED, false); 7992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 8002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 8012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchPause() { 802ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 8032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 8042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 8052dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStop() { 806c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 8072dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 8082dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 8092dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchDestroy() { 810ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.INITIALIZING, false); 8112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = null; 8122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 813f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 814b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) { 815b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 816b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 817b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 818b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 819b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 820b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 821b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onCreateOptionsMenu(menu, inflater); 822b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 823b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 824b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 825b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 826b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 827b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 828b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchPrepareOptionsMenu(Menu menu) { 829b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 830b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 831b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 832b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 833b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 834b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 835b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onPrepareOptionsMenu(menu); 836b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 837b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 838b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 839b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 840b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 841b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 842b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchOptionsItemSelected(MenuItem item) { 843b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 844b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 845b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 846b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 847b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f.onOptionsItemSelected(item)) { 848b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return true; 849b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 850b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 851b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 852b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 853b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return false; 854b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 855b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 8565ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn public boolean dispatchContextItemSelected(MenuItem item) { 8575ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (mActive != null) { 8585ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 8595ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn Fragment f = mAdded.get(i); 8605ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f != null && !f.mHidden) { 8615ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f.onContextItemSelected(item)) { 8625ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return true; 8635ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 8645ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 8655ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 8665ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 8675ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return false; 8685ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 8695ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn 870b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public void dispatchOptionsMenuClosed(Menu menu) { 871b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 872b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 873b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 874b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 875b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onOptionsMenuClosed(menu); 876b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 877b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 878b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 879b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 880b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 881f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int reverseTransit(int transit) { 882f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int rev = 0; 883f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 884f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_ENTER: 885f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_EXIT; 886f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 887f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_EXIT: 888f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_ENTER; 889f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 890f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_SHOW: 891f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_HIDE; 892f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 893f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_HIDE: 894f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_SHOW; 895f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 896f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_ACTIVITY_OPEN: 897f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_ACTIVITY_CLOSE; 898f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 899f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_ACTIVITY_CLOSE: 900f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_ACTIVITY_OPEN; 901f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 902f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_TASK_OPEN: 903f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_TASK_CLOSE; 904f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 905f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_TASK_CLOSE: 906f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_TASK_OPEN; 907f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 908f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_TASK_TO_FRONT: 909f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_TASK_TO_BACK; 910f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 911f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_TASK_TO_BACK: 912f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_TASK_TO_FRONT; 913f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 914f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_WALLPAPER_OPEN: 915f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_WALLPAPER_CLOSE; 916f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 917f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_WALLPAPER_CLOSE: 918f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_WALLPAPER_OPEN; 919f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 920f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_OPEN: 921f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_WALLPAPER_INTRA_CLOSE; 922f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 923f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_CLOSE: 924f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn rev = FragmentTransaction.TRANSIT_WALLPAPER_INTRA_OPEN; 925f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 926f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 927f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return rev; 928f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 929f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 930f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 931f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int transitToStyleIndex(int transit, boolean enter) { 932f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int animAttr = -1; 933f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 934f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_ENTER: 935f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation; 936f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 937f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_EXIT: 938f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation; 939f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 940f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_SHOW: 941f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation; 942f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 943f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_HIDE: 944f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation; 945f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 946f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_ACTIVITY_OPEN: 947f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 948f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation 949f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation; 950f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 951f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_ACTIVITY_CLOSE: 952f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 953f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation 954f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation; 955f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 956f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_TASK_OPEN: 957f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 958f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation 959f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation; 960f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 961f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_TASK_CLOSE: 962f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 963f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation 964f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation; 965f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 966f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_TASK_TO_FRONT: 967f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 968f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation 969f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation; 970f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 971f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_TASK_TO_BACK: 972f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 973f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation 974f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation; 975f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 976f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_WALLPAPER_OPEN: 977f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 978f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation 979f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation; 980f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 981f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_WALLPAPER_CLOSE: 982f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 983f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation 984f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation; 985f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 986f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_OPEN: 987f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 988f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation 989f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation; 990f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 991f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_CLOSE: 992f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 993f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation 994f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation; 995f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 996f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 997f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return animAttr; 998f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 9992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn} 1000