BackStackRecord.java revision 5f3a05c15fa636e911a646e35765ba8bbed7d5e1
15ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn/* 25ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project 35ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * 45ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 55ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * you may not use this file except in compliance with the License. 65ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * You may obtain a copy of the License at 75ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * 85ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 95ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * 105ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 115ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 125ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * See the License for the specific language governing permissions and 145ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * limitations under the License. 155ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn */ 165ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 175ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornpackage android.app; 185ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 193005e17b03d60a4ce0ed5ba04a9f474533c5c564George Mountimport android.content.Context; 203005e17b03d60a4ce0ed5ba04a9f474533c5c564George Mountimport android.content.pm.ApplicationInfo; 21cd916f24a30ea4717ae2c0e66dfeac3355f56869Clara Bayarriimport android.os.Build; 225ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.os.Parcel; 235ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.os.Parcelable; 24c6669ca63299219d815464129dac051ab2404286Dianne Hackbornimport android.text.TextUtils; 25445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackbornimport android.util.Log; 26f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackbornimport android.util.LogWriter; 27d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mountimport android.view.View; 285ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 29a7245b42536bb9e71229651ef7135b039c7df70cGeorge Mountimport com.android.internal.util.FastPrintWriter; 30a7245b42536bb9e71229651ef7135b039c7df70cGeorge Mount 3130d7189067524000c738c188c4ff91f84f474d25Dianne Hackbornimport java.io.FileDescriptor; 3230d7189067524000c738c188c4ff91f84f474d25Dianne Hackbornimport java.io.PrintWriter; 33cd916f24a30ea4717ae2c0e66dfeac3355f56869Clara Bayarriimport java.lang.reflect.Modifier; 345ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport java.util.ArrayList; 355ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 365ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornfinal class BackStackState implements Parcelable { 375ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn final int[] mOps; 385ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn final int mTransition; 395ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn final int mTransitionStyle; 405ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn final String mName; 41dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn final int mIndex; 42c6669ca63299219d815464129dac051ab2404286Dianne Hackborn final int mBreadCrumbTitleRes; 43c6669ca63299219d815464129dac051ab2404286Dianne Hackborn final CharSequence mBreadCrumbTitleText; 44c6669ca63299219d815464129dac051ab2404286Dianne Hackborn final int mBreadCrumbShortTitleRes; 45c6669ca63299219d815464129dac051ab2404286Dianne Hackborn final CharSequence mBreadCrumbShortTitleText; 46d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount final ArrayList<String> mSharedElementSourceNames; 47d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount final ArrayList<String> mSharedElementTargetNames; 48eca8e221db923927cdeca927c0b75807a7612145George Mount final boolean mAllowOptimization; 49c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 50c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public BackStackState(FragmentManagerImpl fm, BackStackRecord bse) { 51f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount final int numOps = bse.mOps.size(); 52f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount mOps = new int[numOps * 6]; 53c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 54b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (!bse.mAddToBackStack) { 55b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalStateException("Not on back stack"); 56b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 57b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 585ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn int pos = 0; 59f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount for (int opNum = 0; opNum < numOps; opNum++) { 60f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount final BackStackRecord.Op op = bse.mOps.get(opNum); 615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mOps[pos++] = op.cmd; 62ee76efb74b5886f98cdfebfbefe9b69224e016fbDianne Hackborn mOps[pos++] = op.fragment != null ? op.fragment.mIndex : -1; 635ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mOps[pos++] = op.enterAnim; 645ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mOps[pos++] = op.exitAnim; 65bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase mOps[pos++] = op.popEnterAnim; 66bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase mOps[pos++] = op.popExitAnim; 675ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 685ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mTransition = bse.mTransition; 695ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mTransitionStyle = bse.mTransitionStyle; 705ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mName = bse.mName; 71dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mIndex = bse.mIndex; 72c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbTitleRes = bse.mBreadCrumbTitleRes; 73c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbTitleText = bse.mBreadCrumbTitleText; 74c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbShortTitleRes = bse.mBreadCrumbShortTitleRes; 75c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbShortTitleText = bse.mBreadCrumbShortTitleText; 76d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount mSharedElementSourceNames = bse.mSharedElementSourceNames; 77d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount mSharedElementTargetNames = bse.mSharedElementTargetNames; 78eca8e221db923927cdeca927c0b75807a7612145George Mount mAllowOptimization = bse.mAllowOptimization; 795ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 80c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 815ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public BackStackState(Parcel in) { 825ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mOps = in.createIntArray(); 835ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mTransition = in.readInt(); 845ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mTransitionStyle = in.readInt(); 855ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mName = in.readString(); 86dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mIndex = in.readInt(); 87c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbTitleRes = in.readInt(); 88c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbTitleText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 89c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbShortTitleRes = in.readInt(); 90c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbShortTitleText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 91d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount mSharedElementSourceNames = in.createStringArrayList(); 92d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount mSharedElementTargetNames = in.createStringArrayList(); 93eca8e221db923927cdeca927c0b75807a7612145George Mount mAllowOptimization = in.readInt() != 0; 945ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 95c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 96c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public BackStackRecord instantiate(FragmentManagerImpl fm) { 97c6669ca63299219d815464129dac051ab2404286Dianne Hackborn BackStackRecord bse = new BackStackRecord(fm); 985ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn int pos = 0; 99f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn int num = 0; 1005ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn while (pos < mOps.length) { 101c6669ca63299219d815464129dac051ab2404286Dianne Hackborn BackStackRecord.Op op = new BackStackRecord.Op(); 1025ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn op.cmd = mOps[pos++]; 103d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount if (FragmentManagerImpl.DEBUG) { 104d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount Log.v(FragmentManagerImpl.TAG, 105d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount "Instantiate " + bse + " op #" + num + " base fragment #" + mOps[pos]); 106d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount } 107ee76efb74b5886f98cdfebfbefe9b69224e016fbDianne Hackborn int findex = mOps[pos++]; 108ee76efb74b5886f98cdfebfbefe9b69224e016fbDianne Hackborn if (findex >= 0) { 109ee76efb74b5886f98cdfebfbefe9b69224e016fbDianne Hackborn Fragment f = fm.mActive.get(findex); 110ee76efb74b5886f98cdfebfbefe9b69224e016fbDianne Hackborn op.fragment = f; 111ee76efb74b5886f98cdfebfbefe9b69224e016fbDianne Hackborn } else { 112ee76efb74b5886f98cdfebfbefe9b69224e016fbDianne Hackborn op.fragment = null; 113ee76efb74b5886f98cdfebfbefe9b69224e016fbDianne Hackborn } 1145ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn op.enterAnim = mOps[pos++]; 1155ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn op.exitAnim = mOps[pos++]; 116bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase op.popEnterAnim = mOps[pos++]; 117bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase op.popExitAnim = mOps[pos++]; 11841fb99480c84683f44b17d2d40bcbfdb8bc12b42George Mount bse.mEnterAnim = op.enterAnim; 11941fb99480c84683f44b17d2d40bcbfdb8bc12b42George Mount bse.mExitAnim = op.exitAnim; 12041fb99480c84683f44b17d2d40bcbfdb8bc12b42George Mount bse.mPopEnterAnim = op.popEnterAnim; 12141fb99480c84683f44b17d2d40bcbfdb8bc12b42George Mount bse.mPopExitAnim = op.popExitAnim; 1225ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn bse.addOp(op); 123f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn num++; 1245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 1255ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn bse.mTransition = mTransition; 1265ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn bse.mTransitionStyle = mTransitionStyle; 1275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn bse.mName = mName; 128dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn bse.mIndex = mIndex; 129b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn bse.mAddToBackStack = true; 130c6669ca63299219d815464129dac051ab2404286Dianne Hackborn bse.mBreadCrumbTitleRes = mBreadCrumbTitleRes; 131c6669ca63299219d815464129dac051ab2404286Dianne Hackborn bse.mBreadCrumbTitleText = mBreadCrumbTitleText; 132c6669ca63299219d815464129dac051ab2404286Dianne Hackborn bse.mBreadCrumbShortTitleRes = mBreadCrumbShortTitleRes; 133c6669ca63299219d815464129dac051ab2404286Dianne Hackborn bse.mBreadCrumbShortTitleText = mBreadCrumbShortTitleText; 134d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount bse.mSharedElementSourceNames = mSharedElementSourceNames; 135d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount bse.mSharedElementTargetNames = mSharedElementTargetNames; 136eca8e221db923927cdeca927c0b75807a7612145George Mount bse.mAllowOptimization = mAllowOptimization; 137b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn bse.bumpBackStackNesting(1); 1385ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return bse; 1395ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 140c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 1415ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public int describeContents() { 1425ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return 0; 1435ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 1445ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 1455ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public void writeToParcel(Parcel dest, int flags) { 1465ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn dest.writeIntArray(mOps); 1475ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn dest.writeInt(mTransition); 1485ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn dest.writeInt(mTransitionStyle); 1495ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn dest.writeString(mName); 150dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn dest.writeInt(mIndex); 151c6669ca63299219d815464129dac051ab2404286Dianne Hackborn dest.writeInt(mBreadCrumbTitleRes); 152c6669ca63299219d815464129dac051ab2404286Dianne Hackborn TextUtils.writeToParcel(mBreadCrumbTitleText, dest, 0); 153c6669ca63299219d815464129dac051ab2404286Dianne Hackborn dest.writeInt(mBreadCrumbShortTitleRes); 154c6669ca63299219d815464129dac051ab2404286Dianne Hackborn TextUtils.writeToParcel(mBreadCrumbShortTitleText, dest, 0); 155d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount dest.writeStringList(mSharedElementSourceNames); 156d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount dest.writeStringList(mSharedElementTargetNames); 157eca8e221db923927cdeca927c0b75807a7612145George Mount dest.writeInt(mAllowOptimization ? 1 : 0); 1585ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 159c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 1605ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public static final Parcelable.Creator<BackStackState> CREATOR 1615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn = new Parcelable.Creator<BackStackState>() { 1625ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public BackStackState createFromParcel(Parcel in) { 1635ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return new BackStackState(in); 1645ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 165c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 1665ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public BackStackState[] newArray(int size) { 1675ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return new BackStackState[size]; 1685ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 1695ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn }; 1705ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn} 1715ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 1725ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn/** 1735ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn * @hide Entry of an operation on the fragment back stack. 1745ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn */ 175ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackbornfinal class BackStackRecord extends FragmentTransaction implements 176eca8e221db923927cdeca927c0b75807a7612145George Mount FragmentManager.BackStackEntry, FragmentManagerImpl.OpGenerator { 177f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn static final String TAG = FragmentManagerImpl.TAG; 178c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 179b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn final FragmentManagerImpl mManager; 180c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 1815ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final int OP_NULL = 0; 1825ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final int OP_ADD = 1; 183b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn static final int OP_REPLACE = 2; 184b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn static final int OP_REMOVE = 3; 185b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn static final int OP_HIDE = 4; 186b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn static final int OP_SHOW = 5; 18747c4156567ce5abf8a6fca7fefe6ae9a20fb5117Dianne Hackborn static final int OP_DETACH = 6; 18847c4156567ce5abf8a6fca7fefe6ae9a20fb5117Dianne Hackborn static final int OP_ATTACH = 7; 1895f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell static final int OP_SET_PRIMARY_NAV = 8; 1905f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell static final int OP_UNSET_PRIMARY_NAV = 9; 191c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 1925ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final class Op { 1935ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn int cmd; 1945ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment fragment; 1955ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn int enterAnim; 1965ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn int exitAnim; 197bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase int popEnterAnim; 198bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase int popExitAnim; 1995f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell 2005f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell Op() { 2015f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell } 2025f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell 2035f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell Op(int cmd, Fragment fragment) { 2045f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell this.cmd = cmd; 2055f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell this.fragment = fragment; 2065f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell } 2075ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 208c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 209f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount ArrayList<Op> mOps = new ArrayList<>(); 2105ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn int mEnterAnim; 2115ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn int mExitAnim; 212bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase int mPopEnterAnim; 213bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase int mPopExitAnim; 2145ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn int mTransition; 2155ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn int mTransitionStyle; 2165ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn boolean mAddToBackStack; 2170c24a5514c1ff143a223720a090b19a86a75945fAdam Powell boolean mAllowAddToBackStack = true; 2185ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn String mName; 2195ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn boolean mCommitted; 220f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn int mIndex = -1; 221eca8e221db923927cdeca927c0b75807a7612145George Mount boolean mAllowOptimization; 222c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 223c6669ca63299219d815464129dac051ab2404286Dianne Hackborn int mBreadCrumbTitleRes; 224c6669ca63299219d815464129dac051ab2404286Dianne Hackborn CharSequence mBreadCrumbTitleText; 225c6669ca63299219d815464129dac051ab2404286Dianne Hackborn int mBreadCrumbShortTitleRes; 226c6669ca63299219d815464129dac051ab2404286Dianne Hackborn CharSequence mBreadCrumbShortTitleText; 227c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 228d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount ArrayList<String> mSharedElementSourceNames; 229d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount ArrayList<String> mSharedElementTargetNames; 230d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount 231f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn @Override 232f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn public String toString() { 233f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn StringBuilder sb = new StringBuilder(128); 234f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn sb.append("BackStackEntry{"); 235f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(this))); 236f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn if (mIndex >= 0) { 237f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn sb.append(" #"); 238f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn sb.append(mIndex); 239d04ad541def2bca8fc2d810514ee15ab97893d35Dianne Hackborn } 240f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn if (mName != null) { 241f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn sb.append(" "); 242f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn sb.append(mName); 24330d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn } 244f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn sb.append("}"); 245f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn return sb.toString(); 246f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn } 247f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn 248f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 249f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn dump(prefix, writer, true); 250f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn } 251f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn 252f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn void dump(String prefix, PrintWriter writer, boolean full) { 253f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn if (full) { 254d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(prefix); 255d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print("mName="); 256d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(mName); 257d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(" mIndex="); 258d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(mIndex); 259d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(" mCommitted="); 260d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.println(mCommitted); 261f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn if (mTransition != FragmentTransaction.TRANSIT_NONE) { 262d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(prefix); 263d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print("mTransition=#"); 264d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(Integer.toHexString(mTransition)); 265d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(" mTransitionStyle=#"); 266d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.println(Integer.toHexString(mTransitionStyle)); 267f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn } 268d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount if (mEnterAnim != 0 || mExitAnim != 0) { 269d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(prefix); 270d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print("mEnterAnim=#"); 271d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(Integer.toHexString(mEnterAnim)); 272d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(" mExitAnim=#"); 273d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.println(Integer.toHexString(mExitAnim)); 274f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn } 275d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount if (mPopEnterAnim != 0 || mPopExitAnim != 0) { 276d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(prefix); 277d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print("mPopEnterAnim=#"); 278d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(Integer.toHexString(mPopEnterAnim)); 279d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(" mPopExitAnim=#"); 280d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.println(Integer.toHexString(mPopExitAnim)); 281f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn } 282f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn if (mBreadCrumbTitleRes != 0 || mBreadCrumbTitleText != null) { 283d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(prefix); 284d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print("mBreadCrumbTitleRes=#"); 285d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(Integer.toHexString(mBreadCrumbTitleRes)); 286d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(" mBreadCrumbTitleText="); 287d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.println(mBreadCrumbTitleText); 288f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn } 289f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn if (mBreadCrumbShortTitleRes != 0 || mBreadCrumbShortTitleText != null) { 290d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(prefix); 291d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print("mBreadCrumbShortTitleRes=#"); 292d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(Integer.toHexString(mBreadCrumbShortTitleRes)); 293d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(" mBreadCrumbShortTitleText="); 294d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.println(mBreadCrumbShortTitleText); 295f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn } 29630d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn } 29730d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn 298f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount if (!mOps.isEmpty()) { 299d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(prefix); 300d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.println("Operations:"); 30130d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn String innerPrefix = prefix + " "; 302f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount final int numOps = mOps.size(); 303f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount for (int opNum = 0; opNum < numOps; opNum++) { 304f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount final Op op = mOps.get(opNum); 305f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn String cmdStr; 306f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn switch (op.cmd) { 307d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount case OP_NULL: 308d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount cmdStr = "NULL"; 309d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount break; 310d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount case OP_ADD: 311d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount cmdStr = "ADD"; 312d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount break; 313d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount case OP_REPLACE: 314d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount cmdStr = "REPLACE"; 315d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount break; 316d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount case OP_REMOVE: 317d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount cmdStr = "REMOVE"; 318d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount break; 319d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount case OP_HIDE: 320d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount cmdStr = "HIDE"; 321d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount break; 322d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount case OP_SHOW: 323d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount cmdStr = "SHOW"; 324d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount break; 325d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount case OP_DETACH: 326d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount cmdStr = "DETACH"; 327d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount break; 328d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount case OP_ATTACH: 329d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount cmdStr = "ATTACH"; 330d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount break; 3315f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell case OP_SET_PRIMARY_NAV: 3325f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell cmdStr="SET_PRIMARY_NAV"; 3335f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell break; 3345f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell case OP_UNSET_PRIMARY_NAV: 3355f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell cmdStr="UNSET_PRIMARY_NAV"; 3365f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell break; 3375f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell 338d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount default: 339d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount cmdStr = "cmd=" + op.cmd; 340d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount break; 34130d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn } 342d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(prefix); 343d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(" Op #"); 344f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount writer.print(opNum); 345d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(": "); 346d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(cmdStr); 347d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(" "); 348d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.println(op.fragment); 349f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn if (full) { 350f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn if (op.enterAnim != 0 || op.exitAnim != 0) { 351d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(innerPrefix); 352d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print("enterAnim=#"); 353d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(Integer.toHexString(op.enterAnim)); 354d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(" exitAnim=#"); 355d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.println(Integer.toHexString(op.exitAnim)); 356f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn } 357f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn if (op.popEnterAnim != 0 || op.popExitAnim != 0) { 358d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(innerPrefix); 359d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print("popEnterAnim=#"); 360d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(Integer.toHexString(op.popEnterAnim)); 361d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.print(" popExitAnim=#"); 362d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount writer.println(Integer.toHexString(op.popExitAnim)); 363f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn } 364bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase } 36530d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn } 36630d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn } 36730d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn } 36830d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn 369c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public BackStackRecord(FragmentManagerImpl manager) { 3705ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mManager = manager; 371d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount mAllowOptimization = getTargetSdk() > Build.VERSION_CODES.N_MR1; 3725ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 373c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 374c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public int getId() { 375c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return mIndex; 376c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 377c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 378327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn public int getBreadCrumbTitleRes() { 379327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn return mBreadCrumbTitleRes; 380327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn } 381327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn 382327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn public int getBreadCrumbShortTitleRes() { 383327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn return mBreadCrumbShortTitleRes; 384327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn } 385327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn 386c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public CharSequence getBreadCrumbTitle() { 387d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount if (mBreadCrumbTitleRes != 0 && mManager.mHost != null) { 388a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return mManager.mHost.getContext().getText(mBreadCrumbTitleRes); 389c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 390c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return mBreadCrumbTitleText; 391c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 392c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 393c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public CharSequence getBreadCrumbShortTitle() { 394d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount if (mBreadCrumbShortTitleRes != 0 && mManager.mHost != null) { 395a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return mManager.mHost.getContext().getText(mBreadCrumbShortTitleRes); 396c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 397c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return mBreadCrumbShortTitleText; 398c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 399c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 4005ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn void addOp(Op op) { 401f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount mOps.add(op); 4025ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn op.enterAnim = mEnterAnim; 4035ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn op.exitAnim = mExitAnim; 404bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase op.popEnterAnim = mPopEnterAnim; 405bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase op.popExitAnim = mPopExitAnim; 4065ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 407c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 4085ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public FragmentTransaction add(Fragment fragment, String tag) { 409b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn doAddOp(0, fragment, tag, OP_ADD); 410b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return this; 4115ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4125ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 4135ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public FragmentTransaction add(int containerViewId, Fragment fragment) { 414b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn doAddOp(containerViewId, fragment, null, OP_ADD); 415b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return this; 4165ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4175ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 4185ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public FragmentTransaction add(int containerViewId, Fragment fragment, String tag) { 419b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn doAddOp(containerViewId, fragment, tag, OP_ADD); 420b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return this; 421b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 422b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 423b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn private void doAddOp(int containerViewId, Fragment fragment, String tag, int opcmd) { 424d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount if (getTargetSdk() > Build.VERSION_CODES.N_MR1) { 425cd916f24a30ea4717ae2c0e66dfeac3355f56869Clara Bayarri final Class fragmentClass = fragment.getClass(); 426cd916f24a30ea4717ae2c0e66dfeac3355f56869Clara Bayarri final int modifiers = fragmentClass.getModifiers(); 427d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount if ((fragmentClass.isAnonymousClass() || !Modifier.isPublic(modifiers) 428cd916f24a30ea4717ae2c0e66dfeac3355f56869Clara Bayarri || (fragmentClass.isMemberClass() && !Modifier.isStatic(modifiers)))) { 429eb7b7ecd40cdfabc1cb3e474738d11ebf4f386c2Clara Bayarri throw new IllegalStateException("Fragment " + fragmentClass.getCanonicalName() 430eb7b7ecd40cdfabc1cb3e474738d11ebf4f386c2Clara Bayarri + " must be a public static class to be properly recreated from" 431eb7b7ecd40cdfabc1cb3e474738d11ebf4f386c2Clara Bayarri + " instance state."); 432cd916f24a30ea4717ae2c0e66dfeac3355f56869Clara Bayarri } 433cd916f24a30ea4717ae2c0e66dfeac3355f56869Clara Bayarri } 4343e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn fragment.mFragmentManager = mManager; 435c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 4365ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (tag != null) { 4375ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mTag != null && !tag.equals(fragment.mTag)) { 4385ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn throw new IllegalStateException("Can't change tag of fragment " 4395ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn + fragment + ": was " + fragment.mTag 4405ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn + " now " + tag); 4415ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4425ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mTag = tag; 4435ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 444c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 4455ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (containerViewId != 0) { 446e01f5957fbbea04138073af423c1c9ae0b510038Adam Powell if (containerViewId == View.NO_ID) { 447e01f5957fbbea04138073af423c1c9ae0b510038Adam Powell throw new IllegalArgumentException("Can't add fragment " 448e01f5957fbbea04138073af423c1c9ae0b510038Adam Powell + fragment + " with tag " + tag + " to container view with no id"); 449e01f5957fbbea04138073af423c1c9ae0b510038Adam Powell } 4505ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mFragmentId != 0 && fragment.mFragmentId != containerViewId) { 4515ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn throw new IllegalStateException("Can't change container ID of fragment " 4525ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn + fragment + ": was " + fragment.mFragmentId 4535ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn + " now " + containerViewId); 4545ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4555ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mContainerId = fragment.mFragmentId = containerViewId; 4565ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 457c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 4585f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell addOp(new Op(opcmd, fragment)); 4595ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4605ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 4615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public FragmentTransaction replace(int containerViewId, Fragment fragment) { 4625ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return replace(containerViewId, fragment, null); 4635ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 464c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 4655ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public FragmentTransaction replace(int containerViewId, Fragment fragment, String tag) { 4665ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (containerViewId == 0) { 4675ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn throw new IllegalArgumentException("Must use non-zero containerViewId"); 4685ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 469c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 470b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn doAddOp(containerViewId, fragment, tag, OP_REPLACE); 471b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return this; 4725ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 473c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 4745ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public FragmentTransaction remove(Fragment fragment) { 4755f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell addOp(new Op(OP_REMOVE, fragment)); 476c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 4775ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return this; 4785ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4795ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 4805ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public FragmentTransaction hide(Fragment fragment) { 4815f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell addOp(new Op(OP_HIDE, fragment)); 482c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 4835ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return this; 4845ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 485c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 4865ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public FragmentTransaction show(Fragment fragment) { 4875f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell addOp(new Op(OP_SHOW, fragment)); 488c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 4895ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return this; 4905ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 491c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 49247c4156567ce5abf8a6fca7fefe6ae9a20fb5117Dianne Hackborn public FragmentTransaction detach(Fragment fragment) { 4935f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell addOp(new Op(OP_DETACH, fragment)); 49447c4156567ce5abf8a6fca7fefe6ae9a20fb5117Dianne Hackborn 49547c4156567ce5abf8a6fca7fefe6ae9a20fb5117Dianne Hackborn return this; 49647c4156567ce5abf8a6fca7fefe6ae9a20fb5117Dianne Hackborn } 49747c4156567ce5abf8a6fca7fefe6ae9a20fb5117Dianne Hackborn 49847c4156567ce5abf8a6fca7fefe6ae9a20fb5117Dianne Hackborn public FragmentTransaction attach(Fragment fragment) { 4995f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell addOp(new Op(OP_ATTACH, fragment)); 5005f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell 5015f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell return this; 5025f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell } 5035f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell 5045f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell public FragmentTransaction setPrimaryNavigationFragment(Fragment fragment) { 5055f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell addOp(new Op(OP_SET_PRIMARY_NAV, fragment)); 50647c4156567ce5abf8a6fca7fefe6ae9a20fb5117Dianne Hackborn 50747c4156567ce5abf8a6fca7fefe6ae9a20fb5117Dianne Hackborn return this; 50847c4156567ce5abf8a6fca7fefe6ae9a20fb5117Dianne Hackborn } 50947c4156567ce5abf8a6fca7fefe6ae9a20fb5117Dianne Hackborn 5105ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public FragmentTransaction setCustomAnimations(int enter, int exit) { 511bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase return setCustomAnimations(enter, exit, 0, 0); 512bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase } 513bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase 514bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase public FragmentTransaction setCustomAnimations(int enter, int exit, 515bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase int popEnter, int popExit) { 5165ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mEnterAnim = enter; 5175ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mExitAnim = exit; 518bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase mPopEnterAnim = popEnter; 519bc377841db05bd5197ffadb58ba52c54b2a85f16Chet Haase mPopExitAnim = popExit; 5205ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return this; 5215ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 522c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 5235ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public FragmentTransaction setTransition(int transition) { 5245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mTransition = transition; 5255ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return this; 5265ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 527c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 528d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount @Override 529448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount public FragmentTransaction addSharedElement(View sharedElement, String name) { 530448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount String transitionName = sharedElement.getTransitionName(); 531448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount if (transitionName == null) { 532448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount throw new IllegalArgumentException("Unique transitionNames are required for all" + 533448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount " sharedElements"); 534448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount } 535448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount if (mSharedElementSourceNames == null) { 536448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount mSharedElementSourceNames = new ArrayList<String>(); 537448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount mSharedElementTargetNames = new ArrayList<String>(); 5384efeb4f4d47a2ea5c37da9b0ad52cb288e94483eGeorge Mount } else if (mSharedElementTargetNames.contains(name)) { 5394efeb4f4d47a2ea5c37da9b0ad52cb288e94483eGeorge Mount throw new IllegalArgumentException("A shared element with the target name '" 5404efeb4f4d47a2ea5c37da9b0ad52cb288e94483eGeorge Mount + name + "' has already been added to the transaction."); 5414efeb4f4d47a2ea5c37da9b0ad52cb288e94483eGeorge Mount } else if (mSharedElementSourceNames.contains(transitionName)) { 5424efeb4f4d47a2ea5c37da9b0ad52cb288e94483eGeorge Mount throw new IllegalArgumentException("A shared element with the source name '" 5434efeb4f4d47a2ea5c37da9b0ad52cb288e94483eGeorge Mount + transitionName + " has already been added to the transaction."); 544448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount } 545448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount mSharedElementSourceNames.add(transitionName); 546448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount mSharedElementTargetNames.add(name); 547448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount return this; 548448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount } 549448bace8612b0f9a41844339ca5db1b8eac1ac5cGeorge Mount 5505ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public FragmentTransaction setTransitionStyle(int styleRes) { 5515ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mTransitionStyle = styleRes; 5525ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return this; 5535ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 554c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 5555ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public FragmentTransaction addToBackStack(String name) { 5560c24a5514c1ff143a223720a090b19a86a75945fAdam Powell if (!mAllowAddToBackStack) { 5570c24a5514c1ff143a223720a090b19a86a75945fAdam Powell throw new IllegalStateException( 5580c24a5514c1ff143a223720a090b19a86a75945fAdam Powell "This FragmentTransaction is not allowed to be added to the back stack."); 5590c24a5514c1ff143a223720a090b19a86a75945fAdam Powell } 5605ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mAddToBackStack = true; 5615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mName = name; 5625ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return this; 5635ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 5645ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 5650c24a5514c1ff143a223720a090b19a86a75945fAdam Powell public boolean isAddToBackStackAllowed() { 5660c24a5514c1ff143a223720a090b19a86a75945fAdam Powell return mAllowAddToBackStack; 5670c24a5514c1ff143a223720a090b19a86a75945fAdam Powell } 5680c24a5514c1ff143a223720a090b19a86a75945fAdam Powell 5690c24a5514c1ff143a223720a090b19a86a75945fAdam Powell public FragmentTransaction disallowAddToBackStack() { 5700c24a5514c1ff143a223720a090b19a86a75945fAdam Powell if (mAddToBackStack) { 5710c24a5514c1ff143a223720a090b19a86a75945fAdam Powell throw new IllegalStateException( 5720c24a5514c1ff143a223720a090b19a86a75945fAdam Powell "This transaction is already being added to the back stack"); 5730c24a5514c1ff143a223720a090b19a86a75945fAdam Powell } 5740c24a5514c1ff143a223720a090b19a86a75945fAdam Powell mAllowAddToBackStack = false; 5750c24a5514c1ff143a223720a090b19a86a75945fAdam Powell return this; 5760c24a5514c1ff143a223720a090b19a86a75945fAdam Powell } 5770c24a5514c1ff143a223720a090b19a86a75945fAdam Powell 578c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public FragmentTransaction setBreadCrumbTitle(int res) { 579c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbTitleRes = res; 580c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbTitleText = null; 581c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return this; 582c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 583c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 584c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public FragmentTransaction setBreadCrumbTitle(CharSequence text) { 585c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbTitleRes = 0; 586c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbTitleText = text; 587c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return this; 588c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 589c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 590c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public FragmentTransaction setBreadCrumbShortTitle(int res) { 591c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbShortTitleRes = res; 592c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbShortTitleText = null; 593c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return this; 594c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 595c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 596c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public FragmentTransaction setBreadCrumbShortTitle(CharSequence text) { 597c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbShortTitleRes = 0; 598c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBreadCrumbShortTitleText = text; 599c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return this; 600c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 601c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 602b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn void bumpBackStackNesting(int amt) { 603b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (!mAddToBackStack) { 604b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return; 605b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 606d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount if (FragmentManagerImpl.DEBUG) { 607d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount Log.v(TAG, "Bump nesting in " + this 608d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount + " by " + amt); 609d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount } 610f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount final int numOps = mOps.size(); 611f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount for (int opNum = 0; opNum < numOps; opNum++) { 612f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount final Op op = mOps.get(opNum); 613ee76efb74b5886f98cdfebfbefe9b69224e016fbDianne Hackborn if (op.fragment != null) { 614ee76efb74b5886f98cdfebfbefe9b69224e016fbDianne Hackborn op.fragment.mBackStackNesting += amt; 615d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount if (FragmentManagerImpl.DEBUG) { 616d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount Log.v(TAG, "Bump nesting of " 617d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount + op.fragment + " to " + op.fragment.mBackStackNesting); 618d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount } 619ee76efb74b5886f98cdfebfbefe9b69224e016fbDianne Hackborn } 620b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 621b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 622b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 623dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public int commit() { 624ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn return commitInternal(false); 625ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn } 626ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn 627ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public int commitAllowingStateLoss() { 628ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn return commitInternal(true); 629ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn } 630d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount 6318585ed66b947ef30d6a43f0bb91885ed0c5ebfb4Adam Powell @Override 6328585ed66b947ef30d6a43f0bb91885ed0c5ebfb4Adam Powell public void commitNow() { 6338585ed66b947ef30d6a43f0bb91885ed0c5ebfb4Adam Powell disallowAddToBackStack(); 6348585ed66b947ef30d6a43f0bb91885ed0c5ebfb4Adam Powell mManager.execSingleAction(this, false); 6358585ed66b947ef30d6a43f0bb91885ed0c5ebfb4Adam Powell } 6368585ed66b947ef30d6a43f0bb91885ed0c5ebfb4Adam Powell 6378585ed66b947ef30d6a43f0bb91885ed0c5ebfb4Adam Powell @Override 6388585ed66b947ef30d6a43f0bb91885ed0c5ebfb4Adam Powell public void commitNowAllowingStateLoss() { 6398585ed66b947ef30d6a43f0bb91885ed0c5ebfb4Adam Powell disallowAddToBackStack(); 6408585ed66b947ef30d6a43f0bb91885ed0c5ebfb4Adam Powell mManager.execSingleAction(this, true); 6418585ed66b947ef30d6a43f0bb91885ed0c5ebfb4Adam Powell } 6428585ed66b947ef30d6a43f0bb91885ed0c5ebfb4Adam Powell 643eca8e221db923927cdeca927c0b75807a7612145George Mount @Override 644eca8e221db923927cdeca927c0b75807a7612145George Mount public FragmentTransaction setAllowOptimization(boolean allowOptimization) { 645eca8e221db923927cdeca927c0b75807a7612145George Mount mAllowOptimization = allowOptimization; 646eca8e221db923927cdeca927c0b75807a7612145George Mount return this; 647eca8e221db923927cdeca927c0b75807a7612145George Mount } 648eca8e221db923927cdeca927c0b75807a7612145George Mount 649ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn int commitInternal(boolean allowStateLoss) { 650d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount if (mCommitted) { 651d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount throw new IllegalStateException("commit already called"); 652d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount } 653f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn if (FragmentManagerImpl.DEBUG) { 654f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn Log.v(TAG, "Commit: " + this); 655f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn LogWriter logw = new LogWriter(Log.VERBOSE, TAG); 6568c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn PrintWriter pw = new FastPrintWriter(logw, false, 1024); 657f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn dump(" ", null, pw, null); 6588c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn pw.flush(); 659f43a33c5ea5adb8d100ab0c3da965bac33155cb8Dianne Hackborn } 6605ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mCommitted = true; 661dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAddToBackStack) { 662dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mIndex = mManager.allocBackStackIndex(this); 663dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } else { 664dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mIndex = -1; 665dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 666ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn mManager.enqueueAction(this, allowStateLoss); 667dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return mIndex; 6685ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 669d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount 670eca8e221db923927cdeca927c0b75807a7612145George Mount /** 67186bfc666d33592f7db5584036aab8c44164d8dc2George Mount * Implementation of {@link android.app.FragmentManagerImpl.OpGenerator}. 672eca8e221db923927cdeca927c0b75807a7612145George Mount * This operation is added to the list of pending actions during {@link #commit()}, and 673eca8e221db923927cdeca927c0b75807a7612145George Mount * will be executed on the UI thread to run this FragmentTransaction. 674eca8e221db923927cdeca927c0b75807a7612145George Mount * 675eca8e221db923927cdeca927c0b75807a7612145George Mount * @param records Modified to add this BackStackRecord 676eca8e221db923927cdeca927c0b75807a7612145George Mount * @param isRecordPop Modified to add a false (this isn't a pop) 677eca8e221db923927cdeca927c0b75807a7612145George Mount * @return true always because the records and isRecordPop will always be changed 678eca8e221db923927cdeca927c0b75807a7612145George Mount */ 679eca8e221db923927cdeca927c0b75807a7612145George Mount @Override 680eca8e221db923927cdeca927c0b75807a7612145George Mount public boolean generateOps(ArrayList<BackStackRecord> records, ArrayList<Boolean> isRecordPop) { 681d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount if (FragmentManagerImpl.DEBUG) { 682d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount Log.v(TAG, "Run: " + this); 683d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount } 684c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 685eca8e221db923927cdeca927c0b75807a7612145George Mount records.add(this); 686eca8e221db923927cdeca927c0b75807a7612145George Mount isRecordPop.add(false); 687dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAddToBackStack) { 688eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.addBackStackState(this); 689a7245b42536bb9e71229651ef7135b039c7df70cGeorge Mount } 690eca8e221db923927cdeca927c0b75807a7612145George Mount return true; 691eca8e221db923927cdeca927c0b75807a7612145George Mount } 692d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount 69386bfc666d33592f7db5584036aab8c44164d8dc2George Mount boolean interactsWith(int containerId) { 69486bfc666d33592f7db5584036aab8c44164d8dc2George Mount final int numOps = mOps.size(); 69586bfc666d33592f7db5584036aab8c44164d8dc2George Mount for (int opNum = 0; opNum < numOps; opNum++) { 69686bfc666d33592f7db5584036aab8c44164d8dc2George Mount final Op op = mOps.get(opNum); 6975f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell final int fragContainer = op.fragment != null ? op.fragment.mContainerId : 0; 6985f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell if (fragContainer != 0 && fragContainer == containerId) { 69986bfc666d33592f7db5584036aab8c44164d8dc2George Mount return true; 70086bfc666d33592f7db5584036aab8c44164d8dc2George Mount } 70186bfc666d33592f7db5584036aab8c44164d8dc2George Mount } 70286bfc666d33592f7db5584036aab8c44164d8dc2George Mount return false; 70386bfc666d33592f7db5584036aab8c44164d8dc2George Mount } 70486bfc666d33592f7db5584036aab8c44164d8dc2George Mount 70586bfc666d33592f7db5584036aab8c44164d8dc2George Mount boolean interactsWith(ArrayList<BackStackRecord> records, int startIndex, int endIndex) { 70686bfc666d33592f7db5584036aab8c44164d8dc2George Mount if (endIndex == startIndex) { 70786bfc666d33592f7db5584036aab8c44164d8dc2George Mount return false; 70886bfc666d33592f7db5584036aab8c44164d8dc2George Mount } 70986bfc666d33592f7db5584036aab8c44164d8dc2George Mount final int numOps = mOps.size(); 71086bfc666d33592f7db5584036aab8c44164d8dc2George Mount int lastContainer = -1; 71186bfc666d33592f7db5584036aab8c44164d8dc2George Mount for (int opNum = 0; opNum < numOps; opNum++) { 71286bfc666d33592f7db5584036aab8c44164d8dc2George Mount final Op op = mOps.get(opNum); 7135f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell final int container = op.fragment != null ? op.fragment.mContainerId : 0; 71486bfc666d33592f7db5584036aab8c44164d8dc2George Mount if (container != 0 && container != lastContainer) { 71586bfc666d33592f7db5584036aab8c44164d8dc2George Mount lastContainer = container; 71686bfc666d33592f7db5584036aab8c44164d8dc2George Mount for (int i = startIndex; i < endIndex; i++) { 71786bfc666d33592f7db5584036aab8c44164d8dc2George Mount BackStackRecord record = records.get(i); 71886bfc666d33592f7db5584036aab8c44164d8dc2George Mount final int numThoseOps = record.mOps.size(); 71986bfc666d33592f7db5584036aab8c44164d8dc2George Mount for (int thoseOpIndex = 0; thoseOpIndex < numThoseOps; thoseOpIndex++) { 72086bfc666d33592f7db5584036aab8c44164d8dc2George Mount final Op thatOp = record.mOps.get(thoseOpIndex); 7215f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell final int thatContainer = thatOp.fragment != null 7225f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell ? thatOp.fragment.mContainerId : 0; 7235f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell if (thatContainer == container) { 72486bfc666d33592f7db5584036aab8c44164d8dc2George Mount return true; 72586bfc666d33592f7db5584036aab8c44164d8dc2George Mount } 72686bfc666d33592f7db5584036aab8c44164d8dc2George Mount } 72786bfc666d33592f7db5584036aab8c44164d8dc2George Mount } 72886bfc666d33592f7db5584036aab8c44164d8dc2George Mount } 72986bfc666d33592f7db5584036aab8c44164d8dc2George Mount } 73086bfc666d33592f7db5584036aab8c44164d8dc2George Mount return false; 73186bfc666d33592f7db5584036aab8c44164d8dc2George Mount } 73286bfc666d33592f7db5584036aab8c44164d8dc2George Mount 733eca8e221db923927cdeca927c0b75807a7612145George Mount /** 734eca8e221db923927cdeca927c0b75807a7612145George Mount * Executes the operations contained within this transaction. The Fragment states will only 735eca8e221db923927cdeca927c0b75807a7612145George Mount * be modified if optimizations are not allowed. 736eca8e221db923927cdeca927c0b75807a7612145George Mount */ 737eca8e221db923927cdeca927c0b75807a7612145George Mount void executeOps() { 738f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount final int numOps = mOps.size(); 739f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount for (int opNum = 0; opNum < numOps; opNum++) { 740f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount final Op op = mOps.get(opNum); 741eca8e221db923927cdeca927c0b75807a7612145George Mount final Fragment f = op.fragment; 7425f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell if (f != null) { 7435f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell f.setNextTransition(mTransition, mTransitionStyle); 7445f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell } 7455ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn switch (op.cmd) { 746f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount case OP_ADD: 74786bfc666d33592f7db5584036aab8c44164d8dc2George Mount f.setNextAnim(op.enterAnim); 7485ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn mManager.addFragment(f, false); 749f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount break; 750f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount case OP_REMOVE: 75186bfc666d33592f7db5584036aab8c44164d8dc2George Mount f.setNextAnim(op.exitAnim); 752eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.removeFragment(f); 753f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount break; 754f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount case OP_HIDE: 75586bfc666d33592f7db5584036aab8c44164d8dc2George Mount f.setNextAnim(op.exitAnim); 756eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.hideFragment(f); 757f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount break; 758f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount case OP_SHOW: 75986bfc666d33592f7db5584036aab8c44164d8dc2George Mount f.setNextAnim(op.enterAnim); 760eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.showFragment(f); 761f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount break; 762f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount case OP_DETACH: 76386bfc666d33592f7db5584036aab8c44164d8dc2George Mount f.setNextAnim(op.exitAnim); 764eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.detachFragment(f); 765f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount break; 766f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount case OP_ATTACH: 76786bfc666d33592f7db5584036aab8c44164d8dc2George Mount f.setNextAnim(op.enterAnim); 768eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.attachFragment(f); 769f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount break; 7705f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell case OP_SET_PRIMARY_NAV: 7715f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell mManager.setPrimaryNavigationFragment(f); 7725f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell break; 7735f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell case OP_UNSET_PRIMARY_NAV: 7745f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell mManager.setPrimaryNavigationFragment(null); 7755f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell break; 776f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount default: 7775ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn throw new IllegalArgumentException("Unknown cmd: " + op.cmd); 7785ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7795f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell if (!mAllowOptimization && op.cmd != OP_ADD && f != null) { 780eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.moveFragmentToExpectedState(f); 781eca8e221db923927cdeca927c0b75807a7612145George Mount } 7825ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 783eca8e221db923927cdeca927c0b75807a7612145George Mount if (!mAllowOptimization) { 784eca8e221db923927cdeca927c0b75807a7612145George Mount // Added fragments are added at the end to comply with prior behavior. 785687e5500421b4d99f864bebfed6c573dc4f38191George Mount mManager.moveToState(mManager.mCurState, true); 7865ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7875ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 788c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 789eca8e221db923927cdeca927c0b75807a7612145George Mount /** 790eca8e221db923927cdeca927c0b75807a7612145George Mount * Reverses the execution of the operations within this transaction. The Fragment states will 791eca8e221db923927cdeca927c0b75807a7612145George Mount * only be modified if optimizations are not allowed. 792eca8e221db923927cdeca927c0b75807a7612145George Mount */ 793eca8e221db923927cdeca927c0b75807a7612145George Mount void executePopOps() { 794eca8e221db923927cdeca927c0b75807a7612145George Mount for (int opNum = mOps.size() - 1; opNum >= 0; opNum--) { 795f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount final Op op = mOps.get(opNum); 796eca8e221db923927cdeca927c0b75807a7612145George Mount Fragment f = op.fragment; 7975f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell if (f != null) { 7985f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell f.setNextTransition(FragmentManagerImpl.reverseTransit(mTransition), 7995f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell mTransitionStyle); 8005f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell } 801eca8e221db923927cdeca927c0b75807a7612145George Mount switch (op.cmd) { 802eca8e221db923927cdeca927c0b75807a7612145George Mount case OP_ADD: 80386bfc666d33592f7db5584036aab8c44164d8dc2George Mount f.setNextAnim(op.popExitAnim); 804eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.removeFragment(f); 805eca8e221db923927cdeca927c0b75807a7612145George Mount break; 806eca8e221db923927cdeca927c0b75807a7612145George Mount case OP_REMOVE: 80786bfc666d33592f7db5584036aab8c44164d8dc2George Mount f.setNextAnim(op.popEnterAnim); 808eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.addFragment(f, false); 809eca8e221db923927cdeca927c0b75807a7612145George Mount break; 810eca8e221db923927cdeca927c0b75807a7612145George Mount case OP_HIDE: 81186bfc666d33592f7db5584036aab8c44164d8dc2George Mount f.setNextAnim(op.popEnterAnim); 812eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.showFragment(f); 813eca8e221db923927cdeca927c0b75807a7612145George Mount break; 814eca8e221db923927cdeca927c0b75807a7612145George Mount case OP_SHOW: 81586bfc666d33592f7db5584036aab8c44164d8dc2George Mount f.setNextAnim(op.popExitAnim); 816eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.hideFragment(f); 817eca8e221db923927cdeca927c0b75807a7612145George Mount break; 818eca8e221db923927cdeca927c0b75807a7612145George Mount case OP_DETACH: 81986bfc666d33592f7db5584036aab8c44164d8dc2George Mount f.setNextAnim(op.popEnterAnim); 820eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.attachFragment(f); 821eca8e221db923927cdeca927c0b75807a7612145George Mount break; 822eca8e221db923927cdeca927c0b75807a7612145George Mount case OP_ATTACH: 82386bfc666d33592f7db5584036aab8c44164d8dc2George Mount f.setNextAnim(op.popExitAnim); 824eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.detachFragment(f); 825eca8e221db923927cdeca927c0b75807a7612145George Mount break; 8265f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell case OP_SET_PRIMARY_NAV: 8275f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell mManager.setPrimaryNavigationFragment(null); 8285f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell break; 8295f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell case OP_UNSET_PRIMARY_NAV: 8305f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell mManager.setPrimaryNavigationFragment(f); 8315f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell break; 832eca8e221db923927cdeca927c0b75807a7612145George Mount default: 833eca8e221db923927cdeca927c0b75807a7612145George Mount throw new IllegalArgumentException("Unknown cmd: " + op.cmd); 834eca8e221db923927cdeca927c0b75807a7612145George Mount } 8355f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell if (!mAllowOptimization && op.cmd != OP_REMOVE && f != null) { 836eca8e221db923927cdeca927c0b75807a7612145George Mount mManager.moveFragmentToExpectedState(f); 837f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } 838f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } 839eca8e221db923927cdeca927c0b75807a7612145George Mount if (!mAllowOptimization) { 840687e5500421b4d99f864bebfed6c573dc4f38191George Mount mManager.moveToState(mManager.mCurState, true); 841f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } 842eca8e221db923927cdeca927c0b75807a7612145George Mount } 843f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount 844eca8e221db923927cdeca927c0b75807a7612145George Mount /** 8455f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * Expands all meta-ops into their more primitive equivalents. This must be called prior to 8465f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * {@link #executeOps()} or any other call that operations on mOps for forward navigation. 8475f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * It should not be called for pop/reverse navigation operations. 8485f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * 8495f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * <p>Removes all OP_REPLACE ops and replaces them with the proper add and remove 8505f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * operations that are equivalent to the replace.</p> 8515f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * 8525f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * <p>Adds OP_UNSET_PRIMARY_NAV ops to match OP_SET_PRIMARY_NAV, OP_REMOVE and OP_DETACH 8535f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * ops so that we can restore the old primary nav fragment later. Since callers call this 8545f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * method in a loop before running ops from several transactions at once, the caller should 8555f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * pass the return value from this method as the oldPrimaryNav parameter for the next call. 8565f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * The first call in such a loop should pass the value of 8575f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * {@link FragmentManager#getPrimaryNavigationFragment()}.</p> 858eca8e221db923927cdeca927c0b75807a7612145George Mount * 859eca8e221db923927cdeca927c0b75807a7612145George Mount * @param added Initialized to the fragments that are in the mManager.mAdded, this 860eca8e221db923927cdeca927c0b75807a7612145George Mount * will be modified to contain the fragments that will be in mAdded 861eca8e221db923927cdeca927c0b75807a7612145George Mount * after the execution ({@link #executeOps()}. 8625f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * @param oldPrimaryNav The tracked primary navigation fragment as of the beginning of 8635f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * this set of ops 8645f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell * @return the new oldPrimaryNav fragment after this record's ops would be run 865eca8e221db923927cdeca927c0b75807a7612145George Mount */ 8665f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell Fragment expandOps(ArrayList<Fragment> added, Fragment oldPrimaryNav) { 867f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount for (int opNum = 0; opNum < mOps.size(); opNum++) { 868f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount final Op op = mOps.get(opNum); 869f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount switch (op.cmd) { 870f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount case OP_ADD: 871f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount case OP_ATTACH: 872f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount added.add(op.fragment); 87386bfc666d33592f7db5584036aab8c44164d8dc2George Mount break; 874f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount case OP_REMOVE: 8755f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell case OP_DETACH: { 876f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount added.remove(op.fragment); 8775f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell if (op.fragment == oldPrimaryNav) { 8785f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell mOps.add(opNum, new Op(OP_UNSET_PRIMARY_NAV, op.fragment)); 8795f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell opNum++; 8805f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell oldPrimaryNav = null; 8815f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell } 8825f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell } 8835f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell break; 884f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount case OP_REPLACE: { 8855f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell final Fragment f = op.fragment; 8865f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell final int containerId = f.mContainerId; 887f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount boolean alreadyAdded = false; 888f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount for (int i = added.size() - 1; i >= 0; i--) { 8895f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell final Fragment old = added.get(i); 890f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount if (old.mContainerId == containerId) { 891f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount if (old == f) { 892f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount alreadyAdded = true; 893f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } else { 8945f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell // This is duplicated from above since we only make 8955f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell // a single pass for expanding ops. Unset any outgoing primary nav. 8965f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell if (old == oldPrimaryNav) { 8975f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell mOps.add(opNum, new Op(OP_UNSET_PRIMARY_NAV, old)); 8985f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell opNum++; 8995f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell oldPrimaryNav = null; 9005f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell } 9015f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell final Op removeOp = new Op(OP_REMOVE, old); 902f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount removeOp.enterAnim = op.enterAnim; 903f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount removeOp.popEnterAnim = op.popEnterAnim; 904f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount removeOp.exitAnim = op.exitAnim; 905f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount removeOp.popExitAnim = op.popExitAnim; 906f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount mOps.add(opNum, removeOp); 907f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount added.remove(old); 908f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount opNum++; 909f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } 910f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } 911f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } 912f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount if (alreadyAdded) { 913f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount mOps.remove(opNum); 914f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount opNum--; 915f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } else { 916f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount op.cmd = OP_ADD; 917f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount added.add(f); 918f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } 919f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } 920f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount break; 9215f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell case OP_SET_PRIMARY_NAV: { 9225f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell // It's ok if this is null, that means we will restore to no active 9235f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell // primary navigation fragment on a pop. 9245f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell mOps.add(opNum, new Op(OP_UNSET_PRIMARY_NAV, oldPrimaryNav)); 9255f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell opNum++; 9265f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell // Will be set by the OP_SET_PRIMARY_NAV we inserted before when run 9275f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell oldPrimaryNav = op.fragment; 9285f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell } 9295f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell break; 930f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } 931f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } 9325f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell return oldPrimaryNav; 933f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount } 934f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount 93599c532d0187808591d59366ac92b6d5560a1fbb1George Mount /** 93699c532d0187808591d59366ac92b6d5560a1fbb1George Mount * Removes fragments that are added or removed during a pop operation. 93799c532d0187808591d59366ac92b6d5560a1fbb1George Mount * 93899c532d0187808591d59366ac92b6d5560a1fbb1George Mount * @param added Initialized to the fragments that are in the mManager.mAdded, this 93999c532d0187808591d59366ac92b6d5560a1fbb1George Mount * will be modified to contain the fragments that will be in mAdded 94099c532d0187808591d59366ac92b6d5560a1fbb1George Mount * after the execution ({@link #executeOps()}. 94199c532d0187808591d59366ac92b6d5560a1fbb1George Mount */ 94299c532d0187808591d59366ac92b6d5560a1fbb1George Mount void trackAddedFragmentsInPop(ArrayList<Fragment> added) { 94399c532d0187808591d59366ac92b6d5560a1fbb1George Mount for (int opNum = 0; opNum < mOps.size(); opNum++) { 94499c532d0187808591d59366ac92b6d5560a1fbb1George Mount final Op op = mOps.get(opNum); 94599c532d0187808591d59366ac92b6d5560a1fbb1George Mount switch (op.cmd) { 94699c532d0187808591d59366ac92b6d5560a1fbb1George Mount case OP_ADD: 94799c532d0187808591d59366ac92b6d5560a1fbb1George Mount case OP_ATTACH: 94899c532d0187808591d59366ac92b6d5560a1fbb1George Mount added.remove(op.fragment); 94999c532d0187808591d59366ac92b6d5560a1fbb1George Mount break; 95099c532d0187808591d59366ac92b6d5560a1fbb1George Mount case OP_REMOVE: 95199c532d0187808591d59366ac92b6d5560a1fbb1George Mount case OP_DETACH: 95299c532d0187808591d59366ac92b6d5560a1fbb1George Mount added.add(op.fragment); 95399c532d0187808591d59366ac92b6d5560a1fbb1George Mount break; 95499c532d0187808591d59366ac92b6d5560a1fbb1George Mount } 95599c532d0187808591d59366ac92b6d5560a1fbb1George Mount } 95699c532d0187808591d59366ac92b6d5560a1fbb1George Mount } 95799c532d0187808591d59366ac92b6d5560a1fbb1George Mount 95886bfc666d33592f7db5584036aab8c44164d8dc2George Mount boolean isPostponed() { 95986bfc666d33592f7db5584036aab8c44164d8dc2George Mount for (int opNum = 0; opNum < mOps.size(); opNum++) { 960f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount final Op op = mOps.get(opNum); 96186bfc666d33592f7db5584036aab8c44164d8dc2George Mount if (isFragmentPostponed(op)) { 962c855f7d08f1eede615e10507d5480fceeafd3c3cGeorge Mount return true; 963d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount } 964d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount } 965c855f7d08f1eede615e10507d5480fceeafd3c3cGeorge Mount return false; 966d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount } 967d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount 96886bfc666d33592f7db5584036aab8c44164d8dc2George Mount void setOnStartPostponedListener(Fragment.OnStartEnterTransitionListener listener) { 96986bfc666d33592f7db5584036aab8c44164d8dc2George Mount for (int opNum = 0; opNum < mOps.size(); opNum++) { 97086bfc666d33592f7db5584036aab8c44164d8dc2George Mount final Op op = mOps.get(opNum); 97186bfc666d33592f7db5584036aab8c44164d8dc2George Mount if (isFragmentPostponed(op)) { 97286bfc666d33592f7db5584036aab8c44164d8dc2George Mount op.fragment.setOnStartEnterTransitionListener(listener); 973c03da0e7a9ef721709d51cf8a2d539a5bd8a320eGeorge Mount } 974c03da0e7a9ef721709d51cf8a2d539a5bd8a320eGeorge Mount } 975c03da0e7a9ef721709d51cf8a2d539a5bd8a320eGeorge Mount } 976c03da0e7a9ef721709d51cf8a2d539a5bd8a320eGeorge Mount 97786bfc666d33592f7db5584036aab8c44164d8dc2George Mount private static boolean isFragmentPostponed(Op op) { 97886bfc666d33592f7db5584036aab8c44164d8dc2George Mount final Fragment fragment = op.fragment; 9795f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell return fragment != null && fragment.mAdded && fragment.mView != null && !fragment.mDetached 9805f3a05c15fa636e911a646e35765ba8bbed7d5e1Adam Powell && !fragment.mHidden && fragment.isPostponed(); 9815ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 982c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 9835ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public String getName() { 9845ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return mName; 9855ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 986c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 9875ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public int getTransition() { 9885ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return mTransition; 9895ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 990c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 9915ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public int getTransitionStyle() { 9925ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return mTransitionStyle; 9935ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 9942b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell 9952b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell public boolean isEmpty() { 996f2045f8f0c5c6aba96b6a4ed570cfcbe3e7e1d64George Mount return mOps.isEmpty(); 9972b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell } 998d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount 999d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount /** 1000d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount * @return the target SDK of the FragmentManager's application info. If the 1001d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount * FragmentManager has been torn down, then 0 is returned. 1002d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount */ 1003d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount private int getTargetSdk() { 1004d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount FragmentHostCallback host = mManager.mHost; 1005d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount if (host != null) { 1006d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount Context context = host.getContext(); 1007d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount if (context != null) { 1008d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount ApplicationInfo info = context.getApplicationInfo(); 1009d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount if (info != null) { 1010d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount return info.targetSdkVersion; 1011d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount } 1012d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount } 1013d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount } 1014d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount return 0; 1015d5f70891e114ed47ca7e0e806d2352827292b6d1George Mount } 10165ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn} 1017