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