1cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn/* 2cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Copyright (C) 2011 The Android Open Source Project 3cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 4cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * you may not use this file except in compliance with the License. 6cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * You may obtain a copy of the License at 7cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 8cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 10cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * See the License for the specific language governing permissions and 14cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * limitations under the License. 15cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 16cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 17cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornpackage android.support.v4.app; 18cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 194500be62dea3895a98336122a2944cc4ab024bc5George Mountimport android.os.Build; 20cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.os.Parcel; 21cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.os.Parcelable; 229f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mountimport android.support.v4.util.ArrayMap; 23e1eea177bd4993151679183e88171f1e50c33054George Mountimport android.support.v4.util.LogWriter; 24cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.text.TextUtils; 25cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.util.Log; 269f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mountimport android.util.SparseArray; 274500be62dea3895a98336122a2944cc4ab024bc5George Mountimport android.view.View; 284500be62dea3895a98336122a2944cc4ab024bc5George Mountimport android.view.ViewGroup; 290f5ae57910484f1d873fdad90966b6244a633bd4George Mountimport android.view.ViewTreeObserver; 30cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 31cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport java.io.FileDescriptor; 32cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport java.io.PrintWriter; 33af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport java.lang.reflect.Modifier; 34cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport java.util.ArrayList; 35cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 36cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornfinal class BackStackState implements Parcelable { 37cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final int[] mOps; 38cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final int mTransition; 39cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final int mTransitionStyle; 40cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final String mName; 41cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final int mIndex; 42cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final int mBreadCrumbTitleRes; 43cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final CharSequence mBreadCrumbTitleText; 44cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final int mBreadCrumbShortTitleRes; 45cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final CharSequence mBreadCrumbShortTitleText; 464500be62dea3895a98336122a2944cc4ab024bc5George Mount final ArrayList<String> mSharedElementSourceNames; 474500be62dea3895a98336122a2944cc4ab024bc5George Mount final ArrayList<String> mSharedElementTargetNames; 48cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 49d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy public BackStackState(BackStackRecord bse) { 50cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int numRemoved = 0; 51cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn BackStackRecord.Op op = bse.mHead; 52cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn while (op != null) { 53cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (op.removed != null) numRemoved += op.removed.size(); 54cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op = op.next; 55cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 56df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn mOps = new int[bse.mNumOp*7 + numRemoved]; 57cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 58cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!bse.mAddToBackStack) { 59cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException("Not on back stack"); 60cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 61cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 62cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op = bse.mHead; 63cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int pos = 0; 64cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn while (op != null) { 65cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mOps[pos++] = op.cmd; 665506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn mOps[pos++] = op.fragment != null ? op.fragment.mIndex : -1; 67cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mOps[pos++] = op.enterAnim; 68cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mOps[pos++] = op.exitAnim; 69df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn mOps[pos++] = op.popEnterAnim; 70df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn mOps[pos++] = op.popExitAnim; 71cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (op.removed != null) { 72cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final int N = op.removed.size(); 73cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mOps[pos++] = N; 74cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<N; i++) { 75cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mOps[pos++] = op.removed.get(i).mIndex; 76cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 77cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 78cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mOps[pos++] = 0; 79cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 80cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op = op.next; 81cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 82cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mTransition = bse.mTransition; 83cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mTransitionStyle = bse.mTransitionStyle; 84cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mName = bse.mName; 85cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mIndex = bse.mIndex; 86cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbTitleRes = bse.mBreadCrumbTitleRes; 87cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbTitleText = bse.mBreadCrumbTitleText; 88cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbShortTitleRes = bse.mBreadCrumbShortTitleRes; 89cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbShortTitleText = bse.mBreadCrumbShortTitleText; 904500be62dea3895a98336122a2944cc4ab024bc5George Mount mSharedElementSourceNames = bse.mSharedElementSourceNames; 914500be62dea3895a98336122a2944cc4ab024bc5George Mount mSharedElementTargetNames = bse.mSharedElementTargetNames; 92cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 93cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 94cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public BackStackState(Parcel in) { 95cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mOps = in.createIntArray(); 96cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mTransition = in.readInt(); 97cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mTransitionStyle = in.readInt(); 98cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mName = in.readString(); 99cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mIndex = in.readInt(); 100cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbTitleRes = in.readInt(); 101cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbTitleText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 102cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbShortTitleRes = in.readInt(); 103cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbShortTitleText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 1044500be62dea3895a98336122a2944cc4ab024bc5George Mount mSharedElementSourceNames = in.createStringArrayList(); 1054500be62dea3895a98336122a2944cc4ab024bc5George Mount mSharedElementTargetNames = in.createStringArrayList(); 106cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 107cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 108cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public BackStackRecord instantiate(FragmentManagerImpl fm) { 109cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn BackStackRecord bse = new BackStackRecord(fm); 110cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int pos = 0; 1113a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn int num = 0; 112cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn while (pos < mOps.length) { 113cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn BackStackRecord.Op op = new BackStackRecord.Op(); 114cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.cmd = mOps[pos++]; 115cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG, 1163a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn "Instantiate " + bse + " op #" + num + " base fragment #" + mOps[pos]); 1175506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn int findex = mOps[pos++]; 1185506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn if (findex >= 0) { 1195506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn Fragment f = fm.mActive.get(findex); 1205506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn op.fragment = f; 1215506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn } else { 1225506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn op.fragment = null; 1235506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn } 124cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.enterAnim = mOps[pos++]; 125cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.exitAnim = mOps[pos++]; 126df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn op.popEnterAnim = mOps[pos++]; 127df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn op.popExitAnim = mOps[pos++]; 128cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final int N = mOps[pos++]; 129cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (N > 0) { 130cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.removed = new ArrayList<Fragment>(N); 131cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<N; i++) { 132cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG, 1333a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn "Instantiate " + bse + " set remove fragment #" + mOps[pos]); 134cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment r = fm.mActive.get(mOps[pos++]); 135cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.removed.add(r); 136cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 137cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1382a34327ae05fe323476f4bf40be5de6eebd59cbeGeorge Mount bse.mEnterAnim = op.enterAnim; 1392a34327ae05fe323476f4bf40be5de6eebd59cbeGeorge Mount bse.mExitAnim = op.exitAnim; 1402a34327ae05fe323476f4bf40be5de6eebd59cbeGeorge Mount bse.mPopEnterAnim = op.popEnterAnim; 1412a34327ae05fe323476f4bf40be5de6eebd59cbeGeorge Mount bse.mPopExitAnim = op.popExitAnim; 142cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bse.addOp(op); 1433a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn num++; 144cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 145cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bse.mTransition = mTransition; 146cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bse.mTransitionStyle = mTransitionStyle; 147cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bse.mName = mName; 148cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bse.mIndex = mIndex; 149cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bse.mAddToBackStack = true; 150cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bse.mBreadCrumbTitleRes = mBreadCrumbTitleRes; 151cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bse.mBreadCrumbTitleText = mBreadCrumbTitleText; 152cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bse.mBreadCrumbShortTitleRes = mBreadCrumbShortTitleRes; 153cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bse.mBreadCrumbShortTitleText = mBreadCrumbShortTitleText; 1544500be62dea3895a98336122a2944cc4ab024bc5George Mount bse.mSharedElementSourceNames = mSharedElementSourceNames; 1554500be62dea3895a98336122a2944cc4ab024bc5George Mount bse.mSharedElementTargetNames = mSharedElementTargetNames; 156cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bse.bumpBackStackNesting(1); 157cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return bse; 158cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 159cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 16090ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 161cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int describeContents() { 162cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return 0; 163cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 164cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 16590ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 166cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void writeToParcel(Parcel dest, int flags) { 167cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn dest.writeIntArray(mOps); 168cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn dest.writeInt(mTransition); 169cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn dest.writeInt(mTransitionStyle); 170cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn dest.writeString(mName); 171cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn dest.writeInt(mIndex); 172cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn dest.writeInt(mBreadCrumbTitleRes); 173cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn TextUtils.writeToParcel(mBreadCrumbTitleText, dest, 0); 174cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn dest.writeInt(mBreadCrumbShortTitleRes); 175cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn TextUtils.writeToParcel(mBreadCrumbShortTitleText, dest, 0); 1764500be62dea3895a98336122a2944cc4ab024bc5George Mount dest.writeStringList(mSharedElementSourceNames); 1774500be62dea3895a98336122a2944cc4ab024bc5George Mount dest.writeStringList(mSharedElementTargetNames); 178cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 179cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 180cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final Parcelable.Creator<BackStackState> CREATOR 181cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn = new Parcelable.Creator<BackStackState>() { 18290ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 183cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public BackStackState createFromParcel(Parcel in) { 184cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return new BackStackState(in); 185cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 186cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 18790ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 188cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public BackStackState[] newArray(int size) { 189cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return new BackStackState[size]; 190cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 191cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn }; 192cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn} 193cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 194cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn/** 195c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette * Entry of an operation on the fragment back stack. 196cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 197cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornfinal class BackStackRecord extends FragmentTransaction implements 198cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn FragmentManager.BackStackEntry, Runnable { 1993a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn static final String TAG = FragmentManagerImpl.TAG; 2002f0e3626990f52844ec637cb4ffaaa2dee11eb61George Mount static final boolean SUPPORTS_TRANSITIONS = Build.VERSION.SDK_INT >= 21; 201cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 202cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn final FragmentManagerImpl mManager; 203cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 204cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static final int OP_NULL = 0; 205cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static final int OP_ADD = 1; 206cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static final int OP_REPLACE = 2; 207cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static final int OP_REMOVE = 3; 208cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static final int OP_HIDE = 4; 209cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static final int OP_SHOW = 5; 210eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn static final int OP_DETACH = 6; 211eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn static final int OP_ATTACH = 7; 212cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 213cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static final class Op { 214cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Op next; 215cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Op prev; 216cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int cmd; 217cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment fragment; 218cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int enterAnim; 219cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int exitAnim; 220df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn int popEnterAnim; 221df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn int popExitAnim; 222cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn ArrayList<Fragment> removed; 223cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 224cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 225cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Op mHead; 226cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Op mTail; 227cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int mNumOp; 228cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int mEnterAnim; 229cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int mExitAnim; 230df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn int mPopEnterAnim; 231df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn int mPopExitAnim; 232cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int mTransition; 233cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int mTransitionStyle; 234cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn boolean mAddToBackStack; 235cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn boolean mAllowAddToBackStack = true; 236cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn String mName; 237cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn boolean mCommitted; 2383a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn int mIndex = -1; 239cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 240cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int mBreadCrumbTitleRes; 241cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn CharSequence mBreadCrumbTitleText; 242cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int mBreadCrumbShortTitleRes; 243cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn CharSequence mBreadCrumbShortTitleText; 244cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 2454500be62dea3895a98336122a2944cc4ab024bc5George Mount ArrayList<String> mSharedElementSourceNames; 2464500be62dea3895a98336122a2944cc4ab024bc5George Mount ArrayList<String> mSharedElementTargetNames; 2474500be62dea3895a98336122a2944cc4ab024bc5George Mount 2483a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn @Override 2493a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn public String toString() { 2503a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn StringBuilder sb = new StringBuilder(128); 2513a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn sb.append("BackStackEntry{"); 2523a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(this))); 2533a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (mIndex >= 0) { 2543a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn sb.append(" #"); 2553a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn sb.append(mIndex); 256df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn } 2573a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (mName != null) { 2583a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn sb.append(" "); 2593a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn sb.append(mName); 260cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 2613a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn sb.append("}"); 2623a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn return sb.toString(); 2633a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn } 2643a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn 2653a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 2663a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn dump(prefix, writer, true); 2673a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn } 2683a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn 2693a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn public void dump(String prefix, PrintWriter writer, boolean full) { 2703a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (full) { 2713a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(prefix); writer.print("mName="); writer.print(mName); 2723a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(" mIndex="); writer.print(mIndex); 2733a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(" mCommitted="); writer.println(mCommitted); 2743a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (mTransition != FragmentTransaction.TRANSIT_NONE) { 2753a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(prefix); writer.print("mTransition=#"); 2763a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(Integer.toHexString(mTransition)); 2773a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(" mTransitionStyle=#"); 2783a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.println(Integer.toHexString(mTransitionStyle)); 2793a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn } 2803a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (mEnterAnim != 0 || mExitAnim !=0) { 2813a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(prefix); writer.print("mEnterAnim=#"); 2823a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(Integer.toHexString(mEnterAnim)); 2833a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(" mExitAnim=#"); 2843a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.println(Integer.toHexString(mExitAnim)); 2853a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn } 2863a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (mPopEnterAnim != 0 || mPopExitAnim !=0) { 2873a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(prefix); writer.print("mPopEnterAnim=#"); 2883a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(Integer.toHexString(mPopEnterAnim)); 2893a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(" mPopExitAnim=#"); 2903a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.println(Integer.toHexString(mPopExitAnim)); 2913a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn } 2923a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (mBreadCrumbTitleRes != 0 || mBreadCrumbTitleText != null) { 2933a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(prefix); writer.print("mBreadCrumbTitleRes=#"); 2943a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(Integer.toHexString(mBreadCrumbTitleRes)); 2953a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(" mBreadCrumbTitleText="); 2963a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.println(mBreadCrumbTitleText); 2973a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn } 2983a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (mBreadCrumbShortTitleRes != 0 || mBreadCrumbShortTitleText != null) { 2993a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(prefix); writer.print("mBreadCrumbShortTitleRes=#"); 3003a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(Integer.toHexString(mBreadCrumbShortTitleRes)); 3013a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(" mBreadCrumbShortTitleText="); 3023a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.println(mBreadCrumbShortTitleText); 3033a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn } 304cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 305cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 306cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mHead != null) { 307cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(prefix); writer.println("Operations:"); 308cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn String innerPrefix = prefix + " "; 309cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Op op = mHead; 310cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int num = 0; 311cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn while (op != null) { 3123a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn String cmdStr; 3133a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn switch (op.cmd) { 3143a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn case OP_NULL: cmdStr="NULL"; break; 3153a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn case OP_ADD: cmdStr="ADD"; break; 3163a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn case OP_REPLACE: cmdStr="REPLACE"; break; 3173a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn case OP_REMOVE: cmdStr="REMOVE"; break; 3183a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn case OP_HIDE: cmdStr="HIDE"; break; 3193a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn case OP_SHOW: cmdStr="SHOW"; break; 3203a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn case OP_DETACH: cmdStr="DETACH"; break; 3213a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn case OP_ATTACH: cmdStr="ATTACH"; break; 3223a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn default: cmdStr="cmd=" + op.cmd; break; 323df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn } 3243a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(prefix); writer.print(" Op #"); writer.print(num); 3253a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(": "); writer.print(cmdStr); 3263a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(" "); writer.println(op.fragment); 3273a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (full) { 3283a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (op.enterAnim != 0 || op.exitAnim != 0) { 3293a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(prefix); writer.print("enterAnim=#"); 3303a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(Integer.toHexString(op.enterAnim)); 3313a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(" exitAnim=#"); 3323a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.println(Integer.toHexString(op.exitAnim)); 3333a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn } 3343a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (op.popEnterAnim != 0 || op.popExitAnim != 0) { 3353a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(prefix); writer.print("popEnterAnim=#"); 3363a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(Integer.toHexString(op.popEnterAnim)); 3373a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(" popExitAnim=#"); 3383a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.println(Integer.toHexString(op.popExitAnim)); 3393a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn } 340cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 341cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (op.removed != null && op.removed.size() > 0) { 342cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<op.removed.size(); i++) { 343cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print(innerPrefix); 344cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (op.removed.size() == 1) { 345cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.print("Removed: "); 346cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 3473a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (i == 0) { 3483a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.println("Removed:"); 3493a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn } 3503a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn writer.print(innerPrefix); writer.print(" #"); writer.print(i); 351dea7d510a375df0e0e703bfba5ff63c8acca849eAurimas Liutikas writer.print(": "); 352cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 353cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn writer.println(op.removed.get(i)); 354cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 355cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 356cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op = op.next; 3573a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn num++; 358cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 359cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 360cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 361cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 362cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public BackStackRecord(FragmentManagerImpl manager) { 363cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mManager = manager; 364cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 365cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 36690ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 367cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int getId() { 368cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mIndex; 369cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 370cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 37190ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 372cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int getBreadCrumbTitleRes() { 373cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mBreadCrumbTitleRes; 374cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 375cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 37690ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 377cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int getBreadCrumbShortTitleRes() { 378cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mBreadCrumbShortTitleRes; 379cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 380cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 38190ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 382cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public CharSequence getBreadCrumbTitle() { 383cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mBreadCrumbTitleRes != 0) { 384d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return mManager.mHost.getContext().getText(mBreadCrumbTitleRes); 385cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 386cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mBreadCrumbTitleText; 387cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 388cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 38990ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 390cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public CharSequence getBreadCrumbShortTitle() { 391cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mBreadCrumbShortTitleRes != 0) { 392d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return mManager.mHost.getContext().getText(mBreadCrumbShortTitleRes); 393cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 394cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mBreadCrumbShortTitleText; 395cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 396cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 397cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn void addOp(Op op) { 398cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mHead == null) { 399cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mHead = mTail = op; 400cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 401cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.prev = mTail; 402cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mTail.next = op; 403cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mTail = op; 404cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 405cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.enterAnim = mEnterAnim; 406cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.exitAnim = mExitAnim; 407df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn op.popEnterAnim = mPopEnterAnim; 408df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn op.popExitAnim = mPopExitAnim; 409cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mNumOp++; 410cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 411cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 41290ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 413cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction add(Fragment fragment, String tag) { 414cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn doAddOp(0, fragment, tag, OP_ADD); 415cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 416cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 417cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 41890ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 419cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction add(int containerViewId, Fragment fragment) { 420cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn doAddOp(containerViewId, fragment, null, OP_ADD); 421cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 422cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 423cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 42490ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 425cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction add(int containerViewId, Fragment fragment, String tag) { 426cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn doAddOp(containerViewId, fragment, tag, OP_ADD); 427cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 428cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 429cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 430cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private void doAddOp(int containerViewId, Fragment fragment, String tag, int opcmd) { 431af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Class fragmentClass = fragment.getClass(); 432af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final int modifiers = fragmentClass.getModifiers(); 433af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri if (fragmentClass.isAnonymousClass() || !Modifier.isPublic(modifiers) 434af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri || (fragmentClass.isMemberClass() && !Modifier.isStatic(modifiers))) { 43505ed14f5c36546bd171efdd99282c19231289669Clara Bayarri throw new IllegalStateException("Fragment " + fragmentClass.getCanonicalName() 43605ed14f5c36546bd171efdd99282c19231289669Clara Bayarri + " must be a public static class to be properly recreated from" 43705ed14f5c36546bd171efdd99282c19231289669Clara Bayarri + " instance state."); 438af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 439af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 440cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mFragmentManager = mManager; 441cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 442cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (tag != null) { 443cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragment.mTag != null && !tag.equals(fragment.mTag)) { 444cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException("Can't change tag of fragment " 445cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + fragment + ": was " + fragment.mTag 446cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " now " + tag); 447cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 448cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mTag = tag; 449cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 450cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 451cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (containerViewId != 0) { 45236bd1e9880a74cc53edef99040bbb24fc1cad909Adam Powell if (containerViewId == View.NO_ID) { 45336bd1e9880a74cc53edef99040bbb24fc1cad909Adam Powell throw new IllegalArgumentException("Can't add fragment " 45436bd1e9880a74cc53edef99040bbb24fc1cad909Adam Powell + fragment + " with tag " + tag + " to container view with no id"); 45536bd1e9880a74cc53edef99040bbb24fc1cad909Adam Powell } 456cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (fragment.mFragmentId != 0 && fragment.mFragmentId != containerViewId) { 457cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException("Can't change container ID of fragment " 458cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + fragment + ": was " + fragment.mFragmentId 459cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " now " + containerViewId); 460cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 461cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn fragment.mContainerId = fragment.mFragmentId = containerViewId; 462cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 463cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 464cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Op op = new Op(); 465cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.cmd = opcmd; 466cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.fragment = fragment; 467cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn addOp(op); 468cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 469cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 47090ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 471cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction replace(int containerViewId, Fragment fragment) { 472cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return replace(containerViewId, fragment, null); 473cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 474cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 47590ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 476cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction replace(int containerViewId, Fragment fragment, String tag) { 477cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (containerViewId == 0) { 478cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalArgumentException("Must use non-zero containerViewId"); 479cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 480cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 481cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn doAddOp(containerViewId, fragment, tag, OP_REPLACE); 482cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 483cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 484cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 48590ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 486cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction remove(Fragment fragment) { 487cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Op op = new Op(); 488cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.cmd = OP_REMOVE; 489cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.fragment = fragment; 490cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn addOp(op); 491cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 492cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 493cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 494cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 49590ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 496cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction hide(Fragment fragment) { 497cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Op op = new Op(); 498cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.cmd = OP_HIDE; 499cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.fragment = fragment; 500cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn addOp(op); 501cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 502cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 503cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 504cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 50590ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 506cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction show(Fragment fragment) { 507cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Op op = new Op(); 508cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.cmd = OP_SHOW; 509cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op.fragment = fragment; 510cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn addOp(op); 511cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 512cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 513cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 514cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 51590ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 516eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public FragmentTransaction detach(Fragment fragment) { 517eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn Op op = new Op(); 518eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn op.cmd = OP_DETACH; 519eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn op.fragment = fragment; 520eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn addOp(op); 521eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 522eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return this; 523eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 524eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 52590ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 526eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public FragmentTransaction attach(Fragment fragment) { 527eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn Op op = new Op(); 528eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn op.cmd = OP_ATTACH; 529eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn op.fragment = fragment; 530eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn addOp(op); 531eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 532eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return this; 533eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 534eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 53590ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 536cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction setCustomAnimations(int enter, int exit) { 537df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn return setCustomAnimations(enter, exit, 0, 0); 538df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn } 539df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn 54090ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 541df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn public FragmentTransaction setCustomAnimations(int enter, int exit, 542df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn int popEnter, int popExit) { 543cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mEnterAnim = enter; 544cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mExitAnim = exit; 545df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn mPopEnterAnim = popEnter; 546df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn mPopExitAnim = popExit; 547cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 548cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 549cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 55090ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 551cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction setTransition(int transition) { 552cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mTransition = transition; 553cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 554cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 555cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 5564500be62dea3895a98336122a2944cc4ab024bc5George Mount @Override 557128bb5c66d0b34c5a658c682deb3a0b9199b20c4George Mount public FragmentTransaction addSharedElement(View sharedElement, String name) { 5582f0e3626990f52844ec637cb4ffaaa2dee11eb61George Mount if (SUPPORTS_TRANSITIONS) { 5594500be62dea3895a98336122a2944cc4ab024bc5George Mount String transitionName = FragmentTransitionCompat21.getTransitionName(sharedElement); 5604500be62dea3895a98336122a2944cc4ab024bc5George Mount if (transitionName == null) { 5614500be62dea3895a98336122a2944cc4ab024bc5George Mount throw new IllegalArgumentException("Unique transitionNames are required for all" + 5624500be62dea3895a98336122a2944cc4ab024bc5George Mount " sharedElements"); 5634500be62dea3895a98336122a2944cc4ab024bc5George Mount } 564128bb5c66d0b34c5a658c682deb3a0b9199b20c4George Mount if (mSharedElementSourceNames == null) { 565128bb5c66d0b34c5a658c682deb3a0b9199b20c4George Mount mSharedElementSourceNames = new ArrayList<String>(); 566128bb5c66d0b34c5a658c682deb3a0b9199b20c4George Mount mSharedElementTargetNames = new ArrayList<String>(); 567128bb5c66d0b34c5a658c682deb3a0b9199b20c4George Mount } 5684500be62dea3895a98336122a2944cc4ab024bc5George Mount 569128bb5c66d0b34c5a658c682deb3a0b9199b20c4George Mount mSharedElementSourceNames.add(transitionName); 5704500be62dea3895a98336122a2944cc4ab024bc5George Mount mSharedElementTargetNames.add(name); 5714500be62dea3895a98336122a2944cc4ab024bc5George Mount } 5724500be62dea3895a98336122a2944cc4ab024bc5George Mount return this; 5734500be62dea3895a98336122a2944cc4ab024bc5George Mount } 5744500be62dea3895a98336122a2944cc4ab024bc5George Mount 57590ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 576cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction setTransitionStyle(int styleRes) { 577cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mTransitionStyle = styleRes; 578cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 579cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 580cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 58190ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 582cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction addToBackStack(String name) { 583cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!mAllowAddToBackStack) { 584cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException( 585cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn "This FragmentTransaction is not allowed to be added to the back stack."); 586cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 587cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAddToBackStack = true; 588cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mName = name; 589cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 590cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 591cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 59290ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 593cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public boolean isAddToBackStackAllowed() { 594cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mAllowAddToBackStack; 595cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 596cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 59790ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 598cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction disallowAddToBackStack() { 599cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAddToBackStack) { 600cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException( 601cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn "This transaction is already being added to the back stack"); 602cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 603cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAllowAddToBackStack = false; 604cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 605cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 606cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 60790ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 608cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction setBreadCrumbTitle(int res) { 609cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbTitleRes = res; 610cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbTitleText = null; 611cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 612cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 613cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 61490ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 615cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction setBreadCrumbTitle(CharSequence text) { 616cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbTitleRes = 0; 617cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbTitleText = text; 618cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 619cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 620cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 62190ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 622cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction setBreadCrumbShortTitle(int res) { 623cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbShortTitleRes = res; 624cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbShortTitleText = null; 625cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 626cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 627cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 62890ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 629cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public FragmentTransaction setBreadCrumbShortTitle(CharSequence text) { 630cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbShortTitleRes = 0; 631cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mBreadCrumbShortTitleText = text; 632cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return this; 633cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 634cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 635cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn void bumpBackStackNesting(int amt) { 636cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (!mAddToBackStack) { 637cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return; 638cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 639cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting in " + this 640cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + " by " + amt); 641cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Op op = mHead; 642cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn while (op != null) { 6435506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn if (op.fragment != null) { 6445506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn op.fragment.mBackStackNesting += amt; 6455506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of " 6465506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn + op.fragment + " to " + op.fragment.mBackStackNesting); 6475506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn } 648cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (op.removed != null) { 649cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=op.removed.size()-1; i>=0; i--) { 650cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment r = op.removed.get(i); 651cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn r.mBackStackNesting += amt; 652cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of " 653cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn + r + " to " + r.mBackStackNesting); 654cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 655cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 656cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op = op.next; 657cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 658cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 659cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 66090ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 661cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int commit() { 662cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return commitInternal(false); 663cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 664cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 66590ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 666cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int commitAllowingStateLoss() { 667cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return commitInternal(true); 668cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 669e1fad6fb0ee83d7f2dad3ec3dca6641a425e7244Adam Powell 670e1fad6fb0ee83d7f2dad3ec3dca6641a425e7244Adam Powell @Override 671e1fad6fb0ee83d7f2dad3ec3dca6641a425e7244Adam Powell public void commitNow() { 672e1fad6fb0ee83d7f2dad3ec3dca6641a425e7244Adam Powell disallowAddToBackStack(); 673e1fad6fb0ee83d7f2dad3ec3dca6641a425e7244Adam Powell mManager.execSingleAction(this, false); 674e1fad6fb0ee83d7f2dad3ec3dca6641a425e7244Adam Powell } 675e1fad6fb0ee83d7f2dad3ec3dca6641a425e7244Adam Powell 676e1fad6fb0ee83d7f2dad3ec3dca6641a425e7244Adam Powell @Override 677e1fad6fb0ee83d7f2dad3ec3dca6641a425e7244Adam Powell public void commitNowAllowingStateLoss() { 678e1fad6fb0ee83d7f2dad3ec3dca6641a425e7244Adam Powell disallowAddToBackStack(); 679e1fad6fb0ee83d7f2dad3ec3dca6641a425e7244Adam Powell mManager.execSingleAction(this, true); 680e1fad6fb0ee83d7f2dad3ec3dca6641a425e7244Adam Powell } 681dea7d510a375df0e0e703bfba5ff63c8acca849eAurimas Liutikas 682cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int commitInternal(boolean allowStateLoss) { 683cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mCommitted) throw new IllegalStateException("commit already called"); 6843a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (FragmentManagerImpl.DEBUG) { 6853a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn Log.v(TAG, "Commit: " + this); 6863a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn LogWriter logw = new LogWriter(TAG); 6873a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn PrintWriter pw = new PrintWriter(logw); 6883a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn dump(" ", null, pw, null); 6893a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn } 690cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mCommitted = true; 691cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAddToBackStack) { 692cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mIndex = mManager.allocBackStackIndex(this); 693cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 694cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mIndex = -1; 695cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 696cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mManager.enqueueAction(this, allowStateLoss); 697cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mIndex; 698cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 69990ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas 70090ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 701cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public void run() { 702cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Run: " + this); 703cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 704cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAddToBackStack) { 705cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mIndex < 0) { 706cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalStateException("addToBackStack() called after commit()"); 707cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 708cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 709cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 710cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bumpBackStackNesting(1); 711cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 7129f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount TransitionState state = null; 7139f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount SparseArray<Fragment> firstOutFragments = null; 7149f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount SparseArray<Fragment> lastInFragments = null; 715a674400277f88005ad43df76e42a18fcc067102eGeorge Mount if (SUPPORTS_TRANSITIONS && mManager.mCurState >= Fragment.CREATED) { 7169f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount firstOutFragments = new SparseArray<Fragment>(); 7179f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount lastInFragments = new SparseArray<Fragment>(); 7189f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 7199f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount calculateFragments(firstOutFragments, lastInFragments); 7209f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 7210f5ae57910484f1d873fdad90966b6244a633bd4George Mount state = beginTransition(firstOutFragments, lastInFragments, false); 7229f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 7234500be62dea3895a98336122a2944cc4ab024bc5George Mount 7244500be62dea3895a98336122a2944cc4ab024bc5George Mount int transitionStyle = state != null ? 0 : mTransitionStyle; 7254500be62dea3895a98336122a2944cc4ab024bc5George Mount int transition = state != null ? 0 : mTransition; 726cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Op op = mHead; 727cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn while (op != null) { 7284500be62dea3895a98336122a2944cc4ab024bc5George Mount int enterAnim = state != null ? 0 : op.enterAnim; 7294500be62dea3895a98336122a2944cc4ab024bc5George Mount int exitAnim = state != null ? 0 : op.exitAnim; 730cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn switch (op.cmd) { 731cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case OP_ADD: { 732cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = op.fragment; 7334500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = enterAnim; 734cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mManager.addFragment(f, false); 735cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } break; 736cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case OP_REPLACE: { 737cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = op.fragment; 7381727b768eeeaa246791db74db868574049a562c4Eddie Ringle int containerId = f.mContainerId; 739cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mManager.mAdded != null) { 740c5cea33d2092d265a2b0806ca94400dc85ab5499Aurimas Liutikas for (int i = mManager.mAdded.size() - 1; i >= 0; i--) { 741cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment old = mManager.mAdded.get(i); 742cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (FragmentManagerImpl.DEBUG) Log.v(TAG, 743cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn "OP_REPLACE: adding=" + f + " old=" + old); 7441727b768eeeaa246791db74db868574049a562c4Eddie Ringle if (old.mContainerId == containerId) { 7455506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn if (old == f) { 7465506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn op.fragment = f = null; 7475506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn } else { 7485506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn if (op.removed == null) { 7495506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn op.removed = new ArrayList<Fragment>(); 7505506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn } 7515506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn op.removed.add(old); 7524500be62dea3895a98336122a2944cc4ab024bc5George Mount old.mNextAnim = exitAnim; 7535506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn if (mAddToBackStack) { 7545506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn old.mBackStackNesting += 1; 7555506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of " 7565506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn + old + " to " + old.mBackStackNesting); 7575506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn } 7584500be62dea3895a98336122a2944cc4ab024bc5George Mount mManager.removeFragment(old, transition, transitionStyle); 759cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 760cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 761cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 762cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 7635506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn if (f != null) { 7644500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = enterAnim; 7655506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn mManager.addFragment(f, false); 7665506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn } 767cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } break; 768cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case OP_REMOVE: { 769cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = op.fragment; 7704500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = exitAnim; 7714500be62dea3895a98336122a2944cc4ab024bc5George Mount mManager.removeFragment(f, transition, transitionStyle); 772cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } break; 773cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case OP_HIDE: { 774cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = op.fragment; 7754500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = exitAnim; 7764500be62dea3895a98336122a2944cc4ab024bc5George Mount mManager.hideFragment(f, transition, transitionStyle); 777cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } break; 778cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case OP_SHOW: { 779cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = op.fragment; 7804500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = enterAnim; 7814500be62dea3895a98336122a2944cc4ab024bc5George Mount mManager.showFragment(f, transition, transitionStyle); 782cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } break; 783eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn case OP_DETACH: { 784eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn Fragment f = op.fragment; 7854500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = exitAnim; 7864500be62dea3895a98336122a2944cc4ab024bc5George Mount mManager.detachFragment(f, transition, transitionStyle); 787eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } break; 788eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn case OP_ATTACH: { 789eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn Fragment f = op.fragment; 7904500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = enterAnim; 7914500be62dea3895a98336122a2944cc4ab024bc5George Mount mManager.attachFragment(f, transition, transitionStyle); 792eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } break; 793cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn default: { 794cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalArgumentException("Unknown cmd: " + op.cmd); 795cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 796cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 797cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 798cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op = op.next; 799cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 800cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 8014500be62dea3895a98336122a2944cc4ab024bc5George Mount mManager.moveToState(mManager.mCurState, transition, transitionStyle, true); 802cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 803cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAddToBackStack) { 804cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mManager.addBackStackState(this); 805cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 806cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 807cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 808c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount private static void setFirstOut(SparseArray<Fragment> firstOutFragments, 809c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount SparseArray<Fragment> lastInFragments, Fragment fragment) { 8109f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (fragment != null) { 8119f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount int containerId = fragment.mContainerId; 812c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount if (containerId != 0 && !fragment.isHidden()) { 813c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount if (fragment.isAdded() && fragment.getView() != null 814c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount && firstOutFragments.get(containerId) == null) { 815c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount firstOutFragments.put(containerId, fragment); 816c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount } 817c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount if (lastInFragments.get(containerId) == fragment) { 818c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount lastInFragments.remove(containerId); 819c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount } 8204500be62dea3895a98336122a2944cc4ab024bc5George Mount } 8219f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 8229f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 8239f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 824c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount private void setLastIn(SparseArray<Fragment> firstOutFragments, 825c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount SparseArray<Fragment> lastInFragments, Fragment fragment) { 8269f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (fragment != null) { 8279f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount int containerId = fragment.mContainerId; 8289f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (containerId != 0) { 829c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount if (!fragment.isAdded()) { 830c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount lastInFragments.put(containerId, fragment); 831c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount } 832c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount if (firstOutFragments.get(containerId) == fragment) { 833c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount firstOutFragments.remove(containerId); 834c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount } 8359f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 836a674400277f88005ad43df76e42a18fcc067102eGeorge Mount if (fragment.mState < Fragment.CREATED && mManager.mCurState >= Fragment.CREATED) { 837a674400277f88005ad43df76e42a18fcc067102eGeorge Mount mManager.makeActive(fragment); 838a674400277f88005ad43df76e42a18fcc067102eGeorge Mount mManager.moveToState(fragment, Fragment.CREATED, 0, 0, false); 839a674400277f88005ad43df76e42a18fcc067102eGeorge Mount } 8409f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 8419f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 8429f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 8439f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount /** 8449f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * Finds the first removed fragment and last added fragments when going forward. 8459f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * If none of the fragments have transitions, then both lists will be empty. 8469f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * 8479f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param firstOutFragments The list of first fragments to be removed, keyed on the 8489f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * container ID. This list will be modified by the method. 8499f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param lastInFragments The list of last fragments to be added, keyed on the 8509f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * container ID. This list will be modified by the method. 8519f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount */ 8529f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount private void calculateFragments(SparseArray<Fragment> firstOutFragments, 8539f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount SparseArray<Fragment> lastInFragments) { 8548491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy if (!mManager.mContainer.onHasView()) { 8557516316ffdf6fbf7b248c615404831191daa66a4George Mount return; // nothing to see, so no transitions 8567516316ffdf6fbf7b248c615404831191daa66a4George Mount } 8579f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount Op op = mHead; 8589f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount while (op != null) { 8599f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount switch (op.cmd) { 8609f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_ADD: 861c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setLastIn(firstOutFragments, lastInFragments, op.fragment); 8629f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 8639f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_REPLACE: { 8649f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount Fragment f = op.fragment; 8659f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (mManager.mAdded != null) { 8669f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount for (int i = 0; i < mManager.mAdded.size(); i++) { 8679f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount Fragment old = mManager.mAdded.get(i); 8689f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (f == null || old.mContainerId == f.mContainerId) { 8699f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (old == f) { 8709f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount f = null; 871c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount lastInFragments.remove(old.mContainerId); 8729f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } else { 873c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setFirstOut(firstOutFragments, lastInFragments, old); 8749f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 8759f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 8764500be62dea3895a98336122a2944cc4ab024bc5George Mount } 8774500be62dea3895a98336122a2944cc4ab024bc5George Mount } 878c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setLastIn(firstOutFragments, lastInFragments, op.fragment); 8799f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 8804500be62dea3895a98336122a2944cc4ab024bc5George Mount } 8819f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_REMOVE: 882c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setFirstOut(firstOutFragments, lastInFragments, op.fragment); 8839f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 8849f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_HIDE: 885c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setFirstOut(firstOutFragments, lastInFragments, op.fragment); 8869f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 8879f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_SHOW: 888c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setLastIn(firstOutFragments, lastInFragments, op.fragment); 8899f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 8909f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_DETACH: 891c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setFirstOut(firstOutFragments, lastInFragments, op.fragment); 8929f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 8939f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_ATTACH: 894c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setLastIn(firstOutFragments, lastInFragments, op.fragment); 8959f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 8964500be62dea3895a98336122a2944cc4ab024bc5George Mount } 8979f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 8989f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount op = op.next; 8999f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 9004500be62dea3895a98336122a2944cc4ab024bc5George Mount } 9014500be62dea3895a98336122a2944cc4ab024bc5George Mount 9029f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount /** 9039f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * Finds the first removed fragment and last added fragments when popping the back stack. 9049f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * If none of the fragments have transitions, then both lists will be empty. 9059f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * 9069f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param firstOutFragments The list of first fragments to be removed, keyed on the 9079f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * container ID. This list will be modified by the method. 9089f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param lastInFragments The list of last fragments to be added, keyed on the 9099f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * container ID. This list will be modified by the method. 9109f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount */ 9119f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount public void calculateBackFragments(SparseArray<Fragment> firstOutFragments, 9129f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount SparseArray<Fragment> lastInFragments) { 9138491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy if (!mManager.mContainer.onHasView()) { 9147516316ffdf6fbf7b248c615404831191daa66a4George Mount return; // nothing to see, so no transitions 9157516316ffdf6fbf7b248c615404831191daa66a4George Mount } 916c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount Op op = mTail; 9179f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount while (op != null) { 9189f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount switch (op.cmd) { 9199f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_ADD: 920c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setFirstOut(firstOutFragments, lastInFragments, op.fragment); 9219f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 9229f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_REPLACE: 9239f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (op.removed != null) { 9249f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount for (int i = op.removed.size() - 1; i >= 0; i--) { 925c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setLastIn(firstOutFragments, lastInFragments, op.removed.get(i)); 9264500be62dea3895a98336122a2944cc4ab024bc5George Mount } 9274500be62dea3895a98336122a2944cc4ab024bc5George Mount } 928c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setFirstOut(firstOutFragments, lastInFragments, op.fragment); 9299f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 9309f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_REMOVE: 931c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setLastIn(firstOutFragments, lastInFragments, op.fragment); 9329f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 9339f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_HIDE: 934c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setLastIn(firstOutFragments, lastInFragments, op.fragment); 9359f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 9369f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_SHOW: 937c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setFirstOut(firstOutFragments, lastInFragments, op.fragment); 9389f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 9399f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_DETACH: 940c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setLastIn(firstOutFragments, lastInFragments, op.fragment); 9419f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 9429f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount case OP_ATTACH: 943c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount setFirstOut(firstOutFragments, lastInFragments, op.fragment); 9449f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount break; 9459f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 9469f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 947c062f4fc524e635888fe2c0de1325f6f6b6137bfGeorge Mount op = op.prev; 9489f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 9494500be62dea3895a98336122a2944cc4ab024bc5George Mount } 9504500be62dea3895a98336122a2944cc4ab024bc5George Mount 9519f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount public TransitionState popFromBackStack(boolean doStateMove, TransitionState state, 9529f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount SparseArray<Fragment> firstOutFragments, SparseArray<Fragment> lastInFragments) { 9533a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn if (FragmentManagerImpl.DEBUG) { 9543a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn Log.v(TAG, "popFromBackStack: " + this); 9553a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn LogWriter logw = new LogWriter(TAG); 9563a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn PrintWriter pw = new PrintWriter(logw); 9573a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn dump(" ", null, pw, null); 9583a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn } 959cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 960a674400277f88005ad43df76e42a18fcc067102eGeorge Mount if (SUPPORTS_TRANSITIONS && mManager.mCurState >= Fragment.CREATED) { 9612f0e3626990f52844ec637cb4ffaaa2dee11eb61George Mount if (state == null) { 9622f0e3626990f52844ec637cb4ffaaa2dee11eb61George Mount if (firstOutFragments.size() != 0 || lastInFragments.size() != 0) { 9632f0e3626990f52844ec637cb4ffaaa2dee11eb61George Mount state = beginTransition(firstOutFragments, lastInFragments, true); 9642f0e3626990f52844ec637cb4ffaaa2dee11eb61George Mount } 9652f0e3626990f52844ec637cb4ffaaa2dee11eb61George Mount } else if (!doStateMove) { 9662f0e3626990f52844ec637cb4ffaaa2dee11eb61George Mount setNameOverrides(state, mSharedElementTargetNames, mSharedElementSourceNames); 9679f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 9684500be62dea3895a98336122a2944cc4ab024bc5George Mount } 9694500be62dea3895a98336122a2944cc4ab024bc5George Mount 970cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn bumpBackStackNesting(-1); 971cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 9724500be62dea3895a98336122a2944cc4ab024bc5George Mount int transitionStyle = state != null ? 0 : mTransitionStyle; 9734500be62dea3895a98336122a2944cc4ab024bc5George Mount int transition = state != null ? 0 : mTransition; 974cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Op op = mTail; 975cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn while (op != null) { 9764500be62dea3895a98336122a2944cc4ab024bc5George Mount int popEnterAnim = state != null ? 0 : op.popEnterAnim; 9774500be62dea3895a98336122a2944cc4ab024bc5George Mount int popExitAnim= state != null ? 0 : op.popExitAnim; 978cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn switch (op.cmd) { 979cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case OP_ADD: { 980cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = op.fragment; 9814500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = popExitAnim; 982cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mManager.removeFragment(f, 9834500be62dea3895a98336122a2944cc4ab024bc5George Mount FragmentManagerImpl.reverseTransit(transition), transitionStyle); 984cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } break; 985cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case OP_REPLACE: { 986cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = op.fragment; 9875506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn if (f != null) { 9884500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = popExitAnim; 9895506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn mManager.removeFragment(f, 9904500be62dea3895a98336122a2944cc4ab024bc5George Mount FragmentManagerImpl.reverseTransit(transition), transitionStyle); 9915506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn } 992cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (op.removed != null) { 993cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i=0; i<op.removed.size(); i++) { 994cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment old = op.removed.get(i); 9954500be62dea3895a98336122a2944cc4ab024bc5George Mount old.mNextAnim = popEnterAnim; 996cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mManager.addFragment(old, false); 997cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 998cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 999cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } break; 1000cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case OP_REMOVE: { 1001cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = op.fragment; 10024500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = popEnterAnim; 1003cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mManager.addFragment(f, false); 1004cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } break; 1005cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case OP_HIDE: { 1006cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = op.fragment; 10074500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = popEnterAnim; 1008cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mManager.showFragment(f, 10094500be62dea3895a98336122a2944cc4ab024bc5George Mount FragmentManagerImpl.reverseTransit(transition), transitionStyle); 1010cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } break; 1011cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn case OP_SHOW: { 1012cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Fragment f = op.fragment; 10134500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = popExitAnim; 1014cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mManager.hideFragment(f, 10154500be62dea3895a98336122a2944cc4ab024bc5George Mount FragmentManagerImpl.reverseTransit(transition), transitionStyle); 1016cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } break; 1017eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn case OP_DETACH: { 1018eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn Fragment f = op.fragment; 10194500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = popEnterAnim; 1020eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn mManager.attachFragment(f, 10214500be62dea3895a98336122a2944cc4ab024bc5George Mount FragmentManagerImpl.reverseTransit(transition), transitionStyle); 1022eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } break; 1023eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn case OP_ATTACH: { 1024eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn Fragment f = op.fragment; 10254500be62dea3895a98336122a2944cc4ab024bc5George Mount f.mNextAnim = popEnterAnim; 1026eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn mManager.detachFragment(f, 10274500be62dea3895a98336122a2944cc4ab024bc5George Mount FragmentManagerImpl.reverseTransit(transition), transitionStyle); 1028eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } break; 1029cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn default: { 1030cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn throw new IllegalArgumentException("Unknown cmd: " + op.cmd); 1031cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1032cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1033cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1034cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn op = op.prev; 1035cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1036cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1037cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (doStateMove) { 1038cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mManager.moveToState(mManager.mCurState, 10394500be62dea3895a98336122a2944cc4ab024bc5George Mount FragmentManagerImpl.reverseTransit(transition), transitionStyle, true); 10400f5ae57910484f1d873fdad90966b6244a633bd4George Mount state = null; 1041cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1042cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1043cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mIndex >= 0) { 1044cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mManager.freeBackStackIndex(mIndex); 1045cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mIndex = -1; 1046cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 10474500be62dea3895a98336122a2944cc4ab024bc5George Mount return state; 1048cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1049cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 105090ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 1051cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public String getName() { 1052cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mName; 1053cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1054cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1055cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int getTransition() { 1056cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mTransition; 1057cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1058cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 1059cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public int getTransitionStyle() { 1060cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mTransitionStyle; 1061cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 1062cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 106390ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 1064cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public boolean isEmpty() { 1065cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mNumOp == 0; 1066cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 10679f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 10689f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount /** 10699f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * When custom fragment transitions are used, this sets up the state for each transition 10709f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * and begins the transition. A different transition is started for each fragment container 10719f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * and consists of up to 3 different transitions: the exit transition, a shared element 10729f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * transition and an enter transition. 10739f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * 10749f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * <p>The exit transition operates against the leaf nodes of the first fragment 10759f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * with a view that was removed. If no such fragment was removed, then no exit 10769f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * transition is executed. The exit transition comes from the outgoing fragment.</p> 10779f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * 10789f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * <p>The enter transition operates against the last fragment that was added. If 10799f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * that fragment does not have a view or no fragment was added, then no enter 10809f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * transition is executed. The enter transition comes from the incoming fragment.</p> 10819f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * 10829f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * <p>The shared element transition operates against all views and comes either 10839f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * from the outgoing fragment or the incoming fragment, depending on whether this 10849f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * is going forward or popping the back stack. When going forward, the incoming 10859f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * fragment's enter shared element transition is used, but when going back, the 10869f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * outgoing fragment's return shared element transition is used. Shared element 10879f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * transitions only operate if there is both an incoming and outgoing fragment.</p> 10889f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * 10899f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param firstOutFragments The list of first fragments to be removed, keyed on the 10909f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * container ID. 10919f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param lastInFragments The list of last fragments to be added, keyed on the 10929f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * container ID. 10939f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param isBack true if this is popping the back stack or false if this is a 10949f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * forward operation. 10959f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @return The TransitionState used to complete the operation of the transition 10960f5ae57910484f1d873fdad90966b6244a633bd4George Mount * in {@link #setNameOverrides(BackStackRecord.TransitionState, java.util.ArrayList, 10970f5ae57910484f1d873fdad90966b6244a633bd4George Mount * java.util.ArrayList)}. 10989f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount */ 10999f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount private TransitionState beginTransition(SparseArray<Fragment> firstOutFragments, 11009f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount SparseArray<Fragment> lastInFragments, boolean isBack) { 11019f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount TransitionState state = new TransitionState(); 11029f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 11039f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount // Adding a non-existent target view makes sure that the transitions don't target 11049f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount // any views by default. They'll only target the views we tell add. If we don't 11059f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount // add any, then no views will be targeted. 1106d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy state.nonExistentView = new View(mManager.mHost.getContext()); 11079f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 11088dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount boolean anyTransitionStarted = false; 11099f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount // Go over all leaving fragments. 11109f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount for (int i = 0; i < firstOutFragments.size(); i++) { 11119f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount int containerId = firstOutFragments.keyAt(i); 11128dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount if (configureTransitions(containerId, state, isBack, firstOutFragments, 11138dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount lastInFragments)) { 11148dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount anyTransitionStarted = true; 11158dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount } 11169f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11179f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 11189f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount // Now go over all entering fragments that didn't have a leaving fragment. 11199f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount for (int i = 0; i < lastInFragments.size(); i++) { 11209f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount int containerId = lastInFragments.keyAt(i); 11218dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount if (firstOutFragments.get(containerId) == null && 11229f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount configureTransitions(containerId, state, isBack, firstOutFragments, 11238dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount lastInFragments)) { 11248dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount anyTransitionStarted = true; 11259f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11269f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11279f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 11288dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount if (!anyTransitionStarted) { 11298dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount state = null; 11308dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount } 11318dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount 11329f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount return state; 11339f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11349f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 11359f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount private static Object getEnterTransition(Fragment inFragment, boolean isBack) { 11369f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (inFragment == null) { 11379f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount return null; 11389f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11390f5ae57910484f1d873fdad90966b6244a633bd4George Mount return FragmentTransitionCompat21.cloneTransition(isBack ? 11400f5ae57910484f1d873fdad90966b6244a633bd4George Mount inFragment.getReenterTransition() : inFragment.getEnterTransition()); 11419f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11429f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 11439f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount private static Object getExitTransition(Fragment outFragment, boolean isBack) { 11449f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (outFragment == null) { 11459f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount return null; 11469f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11470f5ae57910484f1d873fdad90966b6244a633bd4George Mount return FragmentTransitionCompat21.cloneTransition(isBack ? 11480f5ae57910484f1d873fdad90966b6244a633bd4George Mount outFragment.getReturnTransition() : outFragment.getExitTransition()); 11499f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11509f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 11519f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount private static Object getSharedElementTransition(Fragment inFragment, Fragment outFragment, 11529f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount boolean isBack) { 11539f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (inFragment == null || outFragment == null) { 11549f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount return null; 11559f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 1156c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount return FragmentTransitionCompat21.wrapSharedElementTransition(isBack ? 11570f5ae57910484f1d873fdad90966b6244a633bd4George Mount outFragment.getSharedElementReturnTransition() : 11580f5ae57910484f1d873fdad90966b6244a633bd4George Mount inFragment.getSharedElementEnterTransition()); 11599f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11609f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 11610f5ae57910484f1d873fdad90966b6244a633bd4George Mount private static Object captureExitingViews(Object exitTransition, Fragment outFragment, 1162c766ad5a6e0c115f08b933ede22375c7070a3391George Mount ArrayList<View> exitingViews, ArrayMap<String, View> namedViews, View nonExistentView) { 11639f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (exitTransition != null) { 11649f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount exitTransition = FragmentTransitionCompat21.captureExitingViews(exitTransition, 1165c766ad5a6e0c115f08b933ede22375c7070a3391George Mount outFragment.getView(), exitingViews, namedViews, nonExistentView); 11669f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11679f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount return exitTransition; 11689f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11699f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 11709f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount private ArrayMap<String, View> remapSharedElements(TransitionState state, Fragment outFragment, 11710f5ae57910484f1d873fdad90966b6244a633bd4George Mount boolean isBack) { 11720f5ae57910484f1d873fdad90966b6244a633bd4George Mount ArrayMap<String, View> namedViews = new ArrayMap<String, View>(); 11739f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (mSharedElementSourceNames != null) { 11749f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount FragmentTransitionCompat21.findNamedViews(namedViews, outFragment.getView()); 11759f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (isBack) { 11769f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount namedViews.retainAll(mSharedElementTargetNames); 11779f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } else { 11789f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount namedViews = remapNames(mSharedElementSourceNames, mSharedElementTargetNames, 11790f5ae57910484f1d873fdad90966b6244a633bd4George Mount namedViews); 11809f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11819f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11829f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 11839f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (isBack) { 11849306f07b1d66f4974a81f781d29739b30124fff0George Mount if (outFragment.mEnterTransitionCallback != null) { 11859306f07b1d66f4974a81f781d29739b30124fff0George Mount outFragment.mEnterTransitionCallback.onMapSharedElements( 11869f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount mSharedElementTargetNames, namedViews); 11879f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11889f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount setBackNameOverrides(state, namedViews, false); 11899f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } else { 11909306f07b1d66f4974a81f781d29739b30124fff0George Mount if (outFragment.mExitTransitionCallback != null) { 11919306f07b1d66f4974a81f781d29739b30124fff0George Mount outFragment.mExitTransitionCallback.onMapSharedElements( 11929f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount mSharedElementTargetNames, namedViews); 11939f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11949f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount setNameOverrides(state, namedViews, false); 11959f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11969f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 11979f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount return namedViews; 11989f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 11999f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 12009f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount /** 12019f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * Configures custom transitions for a specific fragment container. 12029f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * 12039f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param containerId The container ID of the fragments to configure the transition for. 12040f5ae57910484f1d873fdad90966b6244a633bd4George Mount * @param state The Transition State keeping track of the executing transitions. 12059f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param firstOutFragments The list of first fragments to be removed, keyed on the 12069f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * container ID. 12079f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param lastInFragments The list of last fragments to be added, keyed on the 12089f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * container ID. 12099f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param isBack true if this is popping the back stack or false if this is a 12109f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * forward operation. 12119f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount */ 12128dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount private boolean configureTransitions(int containerId, TransitionState state, boolean isBack, 12130f5ae57910484f1d873fdad90966b6244a633bd4George Mount SparseArray<Fragment> firstOutFragments, SparseArray<Fragment> lastInFragments) { 12148491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy ViewGroup sceneRoot = (ViewGroup) mManager.mContainer.onFindViewById(containerId); 12158dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount if (sceneRoot == null) { 12168dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount return false; 12178dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount } 12188dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount final Fragment inFragment = lastInFragments.get(containerId); 12198dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount Fragment outFragment = firstOutFragments.get(containerId); 12208dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount 12218dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount Object enterTransition = getEnterTransition(inFragment, isBack); 12228dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount Object sharedElementTransition = getSharedElementTransition(inFragment, outFragment, 12238dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount isBack); 12248dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount Object exitTransition = getExitTransition(outFragment, isBack); 12258dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount ArrayMap<String, View> namedViews = null; 122662260534040eba52462875a435df2c1f50ab846eGeorge Mount ArrayList<View> sharedElementTargets = new ArrayList<View>(); 12278dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount if (sharedElementTransition != null) { 12288dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount namedViews = remapSharedElements(state, outFragment, isBack); 1229c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount if (namedViews.isEmpty()) { 1230c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount sharedElementTransition = null; 1231c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount namedViews = null; 1232c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount } else { 1233c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount // Notify the start of the transition. 1234c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount SharedElementCallback callback = isBack ? 1235c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount outFragment.mEnterTransitionCallback : 1236c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount inFragment.mEnterTransitionCallback; 1237c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount if (callback != null) { 1238c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount ArrayList<String> names = new ArrayList<String>(namedViews.keySet()); 1239c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount ArrayList<View> views = new ArrayList<View>(namedViews.values()); 1240c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount callback.onSharedElementStart(names, views, null); 1241c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount } 1242c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount prepareSharedElementTransition(state, sceneRoot, sharedElementTransition, 1243ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount inFragment, outFragment, isBack, sharedElementTargets, enterTransition, 1244ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount exitTransition); 12459f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 12468dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount } 1247c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount if (enterTransition == null && sharedElementTransition == null && 1248c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount exitTransition == null) { 1249c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount return false; // no transitions! 1250c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount } 12519f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 12528dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount ArrayList<View> exitingViews = new ArrayList<View>(); 12538dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount exitTransition = captureExitingViews(exitTransition, outFragment, exitingViews, 1254c766ad5a6e0c115f08b933ede22375c7070a3391George Mount namedViews, state.nonExistentView); 12555a8f14de0bb4304f9a3aebdcb35ee0dd607f27f7George Mount 12568dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount // Set the epicenter of the exit transition 12578dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount if (mSharedElementTargetNames != null && namedViews != null) { 12588dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount View epicenterView = namedViews.get(mSharedElementTargetNames.get(0)); 12598dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount if (epicenterView != null) { 12608dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount if (exitTransition != null) { 12618dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount FragmentTransitionCompat21.setEpicenter(exitTransition, epicenterView); 12628dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount } 12638dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount if (sharedElementTransition != null) { 12648dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount FragmentTransitionCompat21.setEpicenter(sharedElementTransition, 12658dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount epicenterView); 12669f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 12679f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 12688dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount } 12699f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 12708dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount FragmentTransitionCompat21.ViewRetriever viewRetriever = 12718dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount new FragmentTransitionCompat21.ViewRetriever() { 12728dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount @Override 12738dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount public View getView() { 12748dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount return inFragment.getView(); 12758dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount } 12768dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount }; 12779f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 12788dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount ArrayList<View> enteringViews = new ArrayList<View>(); 12798dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount ArrayMap<String, View> renamedViews = new ArrayMap<String, View>(); 12809f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 12815f2544c0082203c392bae9b08401d5d9e73ab94dGeorge Mount boolean allowOverlap = true; 12825f2544c0082203c392bae9b08401d5d9e73ab94dGeorge Mount if (inFragment != null) { 12835f2544c0082203c392bae9b08401d5d9e73ab94dGeorge Mount allowOverlap = isBack ? inFragment.getAllowReturnTransitionOverlap() : 12845f2544c0082203c392bae9b08401d5d9e73ab94dGeorge Mount inFragment.getAllowEnterTransitionOverlap(); 12855f2544c0082203c392bae9b08401d5d9e73ab94dGeorge Mount } 12868dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount Object transition = FragmentTransitionCompat21.mergeTransitions(enterTransition, 12878dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount exitTransition, sharedElementTransition, allowOverlap); 12889f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 12898dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount if (transition != null) { 12908dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount FragmentTransitionCompat21.addTransitionTargets(enterTransition, 1291ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount sharedElementTransition, exitTransition, sceneRoot, viewRetriever, 1292ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount state.nonExistentView, state.enteringEpicenterView, state.nameOverrides, 1293ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount enteringViews, exitingViews, namedViews, renamedViews, sharedElementTargets); 12948dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount excludeHiddenFragmentsAfterEnter(sceneRoot, state, containerId, transition); 12950f5ae57910484f1d873fdad90966b6244a633bd4George Mount 12968dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount // We want to exclude hidden views later, so we need a non-null list in the 12978dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount // transition now. 12988dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount FragmentTransitionCompat21.excludeTarget(transition, state.nonExistentView, true); 12998dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount // Now exclude all currently hidden fragments. 13008dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount excludeHiddenFragments(state, containerId, transition); 13010f5ae57910484f1d873fdad90966b6244a633bd4George Mount 13028dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount FragmentTransitionCompat21.beginDelayedTransition(sceneRoot, transition); 13030f5ae57910484f1d873fdad90966b6244a633bd4George Mount 13048dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount FragmentTransitionCompat21.cleanupTransitions(sceneRoot, state.nonExistentView, 13058dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount enterTransition, enteringViews, exitTransition, exitingViews, 130662260534040eba52462875a435df2c1f50ab846eGeorge Mount sharedElementTransition, sharedElementTargets, 13078dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount transition, state.hiddenFragmentViews, renamedViews); 13080f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 13098dfd79ec7028cfdfa1ba69ed7cbf27aac41dc78aGeorge Mount return transition != null; 13100f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 13110f5ae57910484f1d873fdad90966b6244a633bd4George Mount 13120f5ae57910484f1d873fdad90966b6244a633bd4George Mount private void prepareSharedElementTransition(final TransitionState state, final View sceneRoot, 13130f5ae57910484f1d873fdad90966b6244a633bd4George Mount final Object sharedElementTransition, final Fragment inFragment, 131462260534040eba52462875a435df2c1f50ab846eGeorge Mount final Fragment outFragment, final boolean isBack, 1315ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount final ArrayList<View> sharedElementTargets, final Object enterTransition, 1316ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount final Object exitTransition) { 1317ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount if (sharedElementTransition != null) { 1318ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount sceneRoot.getViewTreeObserver().addOnPreDrawListener( 1319ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount new ViewTreeObserver.OnPreDrawListener() { 1320ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount @Override 1321ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount public boolean onPreDraw() { 1322ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this); 13230f5ae57910484f1d873fdad90966b6244a633bd4George Mount 1324ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount // Remove the exclude for the shared elements from the exiting fragment. 132562260534040eba52462875a435df2c1f50ab846eGeorge Mount FragmentTransitionCompat21.removeTargets(sharedElementTransition, 132662260534040eba52462875a435df2c1f50ab846eGeorge Mount sharedElementTargets); 1327ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount // keep the nonExistentView as excluded so the list doesn't get emptied 1328ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount sharedElementTargets.remove(state.nonExistentView); 1329ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount FragmentTransitionCompat21.excludeSharedElementViews(enterTransition, 1330ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount exitTransition, sharedElementTransition, sharedElementTargets, false); 133162260534040eba52462875a435df2c1f50ab846eGeorge Mount sharedElementTargets.clear(); 133262260534040eba52462875a435df2c1f50ab846eGeorge Mount 13330f5ae57910484f1d873fdad90966b6244a633bd4George Mount ArrayMap<String, View> namedViews = mapSharedElementsIn( 13340f5ae57910484f1d873fdad90966b6244a633bd4George Mount state, isBack, inFragment); 1335c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount FragmentTransitionCompat21.setSharedElementTargets(sharedElementTransition, 1336c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount state.nonExistentView, namedViews, sharedElementTargets); 13370f5ae57910484f1d873fdad90966b6244a633bd4George Mount 13380f5ae57910484f1d873fdad90966b6244a633bd4George Mount setEpicenterIn(namedViews, state); 13390f5ae57910484f1d873fdad90966b6244a633bd4George Mount 13400f5ae57910484f1d873fdad90966b6244a633bd4George Mount callSharedElementEnd(state, inFragment, outFragment, isBack, 13410f5ae57910484f1d873fdad90966b6244a633bd4George Mount namedViews); 13420f5ae57910484f1d873fdad90966b6244a633bd4George Mount 1343ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount // Exclude the shared elements from the entering fragment. 1344ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount FragmentTransitionCompat21.excludeSharedElementViews(enterTransition, 1345ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount exitTransition, sharedElementTransition, sharedElementTargets, true); 1346ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount return true; 1347ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount } 1348ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount }); 1349ee22cd83dc6c6f65f93a91713452cbd5a8a12a51George Mount } 13500f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 13510f5ae57910484f1d873fdad90966b6244a633bd4George Mount 1352dea7d510a375df0e0e703bfba5ff63c8acca849eAurimas Liutikas void callSharedElementEnd(TransitionState state, Fragment inFragment, 13530f5ae57910484f1d873fdad90966b6244a633bd4George Mount Fragment outFragment, boolean isBack, ArrayMap<String, View> namedViews) { 13540f5ae57910484f1d873fdad90966b6244a633bd4George Mount SharedElementCallback sharedElementCallback = isBack ? 13550f5ae57910484f1d873fdad90966b6244a633bd4George Mount outFragment.mEnterTransitionCallback : 13560f5ae57910484f1d873fdad90966b6244a633bd4George Mount inFragment.mEnterTransitionCallback; 13570f5ae57910484f1d873fdad90966b6244a633bd4George Mount if (sharedElementCallback != null) { 13580f5ae57910484f1d873fdad90966b6244a633bd4George Mount ArrayList<String> names = new ArrayList<String>(namedViews.keySet()); 13590f5ae57910484f1d873fdad90966b6244a633bd4George Mount ArrayList<View> views = new ArrayList<View>(namedViews.values()); 13600f5ae57910484f1d873fdad90966b6244a633bd4George Mount sharedElementCallback.onSharedElementEnd(names, views, null); 13619f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 13629f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 13639f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 1364dea7d510a375df0e0e703bfba5ff63c8acca849eAurimas Liutikas void setEpicenterIn(ArrayMap<String, View> namedViews, TransitionState state) { 13650f5ae57910484f1d873fdad90966b6244a633bd4George Mount if (mSharedElementTargetNames != null && !namedViews.isEmpty()) { 13660f5ae57910484f1d873fdad90966b6244a633bd4George Mount // now we know the epicenter of the entering transition. 13670f5ae57910484f1d873fdad90966b6244a633bd4George Mount View epicenter = namedViews 13680f5ae57910484f1d873fdad90966b6244a633bd4George Mount .get(mSharedElementTargetNames.get(0)); 13690f5ae57910484f1d873fdad90966b6244a633bd4George Mount if (epicenter != null) { 13700f5ae57910484f1d873fdad90966b6244a633bd4George Mount state.enteringEpicenterView.epicenter = epicenter; 13710f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 13720f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 13730f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 13740f5ae57910484f1d873fdad90966b6244a633bd4George Mount 1375dea7d510a375df0e0e703bfba5ff63c8acca849eAurimas Liutikas ArrayMap<String, View> mapSharedElementsIn(TransitionState state, 13760f5ae57910484f1d873fdad90966b6244a633bd4George Mount boolean isBack, Fragment inFragment) { 13770f5ae57910484f1d873fdad90966b6244a633bd4George Mount // Now map the shared elements in the incoming fragment 13780f5ae57910484f1d873fdad90966b6244a633bd4George Mount ArrayMap<String, View> namedViews = mapEnteringSharedElements(state, inFragment, isBack); 13790f5ae57910484f1d873fdad90966b6244a633bd4George Mount 13800f5ae57910484f1d873fdad90966b6244a633bd4George Mount // remap shared elements and set the name mapping used 13810f5ae57910484f1d873fdad90966b6244a633bd4George Mount // in the shared element transition. 13820f5ae57910484f1d873fdad90966b6244a633bd4George Mount if (isBack) { 13830f5ae57910484f1d873fdad90966b6244a633bd4George Mount if (inFragment.mExitTransitionCallback != null) { 13840f5ae57910484f1d873fdad90966b6244a633bd4George Mount inFragment.mExitTransitionCallback.onMapSharedElements( 13850f5ae57910484f1d873fdad90966b6244a633bd4George Mount mSharedElementTargetNames, namedViews); 13860f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 13870f5ae57910484f1d873fdad90966b6244a633bd4George Mount setBackNameOverrides(state, namedViews, true); 13880f5ae57910484f1d873fdad90966b6244a633bd4George Mount } else { 13890f5ae57910484f1d873fdad90966b6244a633bd4George Mount if (inFragment.mEnterTransitionCallback != null) { 13900f5ae57910484f1d873fdad90966b6244a633bd4George Mount inFragment.mEnterTransitionCallback.onMapSharedElements( 13910f5ae57910484f1d873fdad90966b6244a633bd4George Mount mSharedElementTargetNames, namedViews); 13920f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 13930f5ae57910484f1d873fdad90966b6244a633bd4George Mount setNameOverrides(state, namedViews, true); 13940f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 13950f5ae57910484f1d873fdad90966b6244a633bd4George Mount return namedViews; 13960f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 13970f5ae57910484f1d873fdad90966b6244a633bd4George Mount 13989f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount /** 13999f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * Remaps a name-to-View map, substituting different names for keys. 14009f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * 14019f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param inMap A list of keys found in the map, in the order in toGoInMap 14029f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param toGoInMap A list of keys to use for the new map, in the order of inMap 14039f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param namedViews The current mapping 14040f5ae57910484f1d873fdad90966b6244a633bd4George Mount * @return A copy of namedViews with the keys coming from toGoInMap. 14059f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount */ 14069f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount private static ArrayMap<String, View> remapNames(ArrayList<String> inMap, 14070f5ae57910484f1d873fdad90966b6244a633bd4George Mount ArrayList<String> toGoInMap, ArrayMap<String, View> namedViews) { 14080f5ae57910484f1d873fdad90966b6244a633bd4George Mount if (namedViews.isEmpty()) { 14090f5ae57910484f1d873fdad90966b6244a633bd4George Mount return namedViews; 14100f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 14110f5ae57910484f1d873fdad90966b6244a633bd4George Mount ArrayMap<String, View> remappedViews = new ArrayMap<String, View>(); 14120f5ae57910484f1d873fdad90966b6244a633bd4George Mount int numKeys = inMap.size(); 14130f5ae57910484f1d873fdad90966b6244a633bd4George Mount for (int i = 0; i < numKeys; i++) { 14140f5ae57910484f1d873fdad90966b6244a633bd4George Mount View view = namedViews.get(inMap.get(i)); 14150f5ae57910484f1d873fdad90966b6244a633bd4George Mount if (view != null) { 14160f5ae57910484f1d873fdad90966b6244a633bd4George Mount remappedViews.put(toGoInMap.get(i), view); 14179f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14189f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14190f5ae57910484f1d873fdad90966b6244a633bd4George Mount return remappedViews; 14209f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14219f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 14229f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount /** 14230f5ae57910484f1d873fdad90966b6244a633bd4George Mount * Maps shared elements to views in the entering fragment. 14249f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * 14259f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param state The transition State as returned from {@link #beginTransition( 14269f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * android.util.SparseArray, android.util.SparseArray, boolean)}. 14270f5ae57910484f1d873fdad90966b6244a633bd4George Mount * @param inFragment The last fragment to be added. 14289f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * @param isBack true if this is popping the back stack or false if this is a 14299f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount * forward operation. 14309f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount */ 14310f5ae57910484f1d873fdad90966b6244a633bd4George Mount private ArrayMap<String, View> mapEnteringSharedElements(TransitionState state, 14320f5ae57910484f1d873fdad90966b6244a633bd4George Mount Fragment inFragment, boolean isBack) { 14330f5ae57910484f1d873fdad90966b6244a633bd4George Mount ArrayMap<String, View> namedViews = new ArrayMap<String, View>(); 14349f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount View root = inFragment.getView(); 14359f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (root != null) { 14369f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (mSharedElementSourceNames != null) { 14379f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount FragmentTransitionCompat21.findNamedViews(namedViews, root); 14389f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (isBack) { 14399f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount namedViews = remapNames(mSharedElementSourceNames, 14400f5ae57910484f1d873fdad90966b6244a633bd4George Mount mSharedElementTargetNames, namedViews); 14419f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } else { 14429f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount namedViews.retainAll(mSharedElementTargetNames); 14439f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14449f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14459f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14469f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount return namedViews; 14479f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14489f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 14490f5ae57910484f1d873fdad90966b6244a633bd4George Mount private void excludeHiddenFragmentsAfterEnter(final View sceneRoot, final TransitionState state, 14500f5ae57910484f1d873fdad90966b6244a633bd4George Mount final int containerId, final Object transition) { 14510f5ae57910484f1d873fdad90966b6244a633bd4George Mount sceneRoot.getViewTreeObserver().addOnPreDrawListener( 14520f5ae57910484f1d873fdad90966b6244a633bd4George Mount new ViewTreeObserver.OnPreDrawListener() { 145390ac236504c1a4cac7e91f1ffc523334f2a8f399Aurimas Liutikas @Override 14540f5ae57910484f1d873fdad90966b6244a633bd4George Mount public boolean onPreDraw() { 14550f5ae57910484f1d873fdad90966b6244a633bd4George Mount sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this); 14560f5ae57910484f1d873fdad90966b6244a633bd4George Mount excludeHiddenFragments(state, containerId, transition); 14570f5ae57910484f1d873fdad90966b6244a633bd4George Mount return true; 14580f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 14590f5ae57910484f1d873fdad90966b6244a633bd4George Mount }); 14600f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 14610f5ae57910484f1d873fdad90966b6244a633bd4George Mount 1462dea7d510a375df0e0e703bfba5ff63c8acca849eAurimas Liutikas void excludeHiddenFragments(TransitionState state, int containerId, Object transition) { 14639f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (mManager.mAdded != null) { 14649f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount for (int i = 0; i < mManager.mAdded.size(); i++) { 14659f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount Fragment fragment = mManager.mAdded.get(i); 14669f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (fragment.mView != null && fragment.mContainer != null && 14679f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount fragment.mContainerId == containerId) { 14689f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (fragment.mHidden) { 14699f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (!state.hiddenFragmentViews.contains(fragment.mView)) { 14709f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount FragmentTransitionCompat21.excludeTarget(transition, fragment.mView, 14719f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount true); 14729f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount state.hiddenFragmentViews.add(fragment.mView); 14739f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14749f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } else { 14759f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount FragmentTransitionCompat21.excludeTarget(transition, fragment.mView, 14769f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount false); 14779f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount state.hiddenFragmentViews.remove(fragment.mView); 14789f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14799f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14809f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14819f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14829f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14839f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 14849f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount private static void setNameOverride(ArrayMap<String, String> overrides, 14859f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount String source, String target) { 1486845332cbde9f3624ff4b266e81fb3aae658793eaGeorge Mount if (source != null && target != null) { 14879f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount for (int index = 0; index < overrides.size(); index++) { 14889f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (source.equals(overrides.valueAt(index))) { 14899f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount overrides.setValueAt(index, target); 14909f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount return; 14919f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14929f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14939f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount overrides.put(source, target); 14949f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14959f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 14969f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 14979f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount private static void setNameOverrides(TransitionState state, ArrayList<String> sourceNames, 14989f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount ArrayList<String> targetNames) { 14999f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (sourceNames != null) { 15009f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount for (int i = 0; i < sourceNames.size(); i++) { 15019f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount String source = sourceNames.get(i); 15029f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount String target = targetNames.get(i); 15039f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount setNameOverride(state.nameOverrides, source, target); 15049f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 15059f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 15069f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 15079f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 15089f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount private void setBackNameOverrides(TransitionState state, ArrayMap<String, View> namedViews, 15099f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount boolean isEnd) { 15105a8f14de0bb4304f9a3aebdcb35ee0dd607f27f7George Mount int count = mSharedElementTargetNames == null ? 0 : mSharedElementTargetNames.size(); 15119f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount for (int i = 0; i < count; i++) { 15129f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount String source = mSharedElementSourceNames.get(i); 15139f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount String originalTarget = mSharedElementTargetNames.get(i); 15149f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount View view = namedViews.get(originalTarget); 15150f5ae57910484f1d873fdad90966b6244a633bd4George Mount if (view != null) { 15160f5ae57910484f1d873fdad90966b6244a633bd4George Mount String target = FragmentTransitionCompat21.getTransitionName(view); 15170f5ae57910484f1d873fdad90966b6244a633bd4George Mount if (isEnd) { 15180f5ae57910484f1d873fdad90966b6244a633bd4George Mount setNameOverride(state.nameOverrides, source, target); 15190f5ae57910484f1d873fdad90966b6244a633bd4George Mount } else { 15200f5ae57910484f1d873fdad90966b6244a633bd4George Mount setNameOverride(state.nameOverrides, target, source); 15210f5ae57910484f1d873fdad90966b6244a633bd4George Mount } 15229f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 15239f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 15249f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 15259f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 15269f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount private void setNameOverrides(TransitionState state, ArrayMap<String, View> namedViews, 15279f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount boolean isEnd) { 15289f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount int count = namedViews.size(); 15299f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount for (int i = 0; i < count; i++) { 15309f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount String source = namedViews.keyAt(i); 15319f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount String target = FragmentTransitionCompat21.getTransitionName(namedViews.valueAt(i)); 15329f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount if (isEnd) { 15339f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount setNameOverride(state.nameOverrides, source, target); 15349f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } else { 15359f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount setNameOverride(state.nameOverrides, target, source); 15369f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 15379f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 15389f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 15399f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 15409f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount public class TransitionState { 15419f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount public ArrayMap<String, String> nameOverrides = new ArrayMap<String, String>(); 15429f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount public ArrayList<View> hiddenFragmentViews = new ArrayList<View>(); 15439f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount 15449f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount public FragmentTransitionCompat21.EpicenterView enteringEpicenterView = 15459f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount new FragmentTransitionCompat21.EpicenterView(); 15469f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount public View nonExistentView; 15479f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount } 1548cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn} 1549