1cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn/*
2cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Copyright (C) 2011 The Android Open Source Project
3cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn *
4cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * you may not use this file except in compliance with the License.
6cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * You may obtain a copy of the License at
7cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn *
8cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn *
10cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
11cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * See the License for the specific language governing permissions and
14cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * limitations under the License.
15cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */
16cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
17cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornpackage android.support.v4.app;
18cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
19cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.os.Parcel;
20cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.os.Parcelable;
213a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackbornimport android.support.v4.util.LogWriter;
22cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.text.TextUtils;
23cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport android.util.Log;
24cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
25cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport java.io.FileDescriptor;
26cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport java.io.PrintWriter;
27cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport java.util.ArrayList;
28cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
29cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornfinal class BackStackState implements Parcelable {
30cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    final int[] mOps;
31cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    final int mTransition;
32cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    final int mTransitionStyle;
33cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    final String mName;
34cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    final int mIndex;
35cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    final int mBreadCrumbTitleRes;
36cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    final CharSequence mBreadCrumbTitleText;
37cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    final int mBreadCrumbShortTitleRes;
38cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    final CharSequence mBreadCrumbShortTitleText;
39cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
40cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public BackStackState(FragmentManagerImpl fm, BackStackRecord bse) {
41cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        int numRemoved = 0;
42cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        BackStackRecord.Op op = bse.mHead;
43cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        while (op != null) {
44cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            if (op.removed != null) numRemoved += op.removed.size();
45cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            op = op.next;
46cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
47df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn        mOps = new int[bse.mNumOp*7 + numRemoved];
48cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
49cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (!bse.mAddToBackStack) {
50cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            throw new IllegalStateException("Not on back stack");
51cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
52cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
53cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        op = bse.mHead;
54cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        int pos = 0;
55cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        while (op != null) {
56cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            mOps[pos++] = op.cmd;
575506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn            mOps[pos++] = op.fragment != null ? op.fragment.mIndex : -1;
58cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            mOps[pos++] = op.enterAnim;
59cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            mOps[pos++] = op.exitAnim;
60df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn            mOps[pos++] = op.popEnterAnim;
61df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn            mOps[pos++] = op.popExitAnim;
62cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            if (op.removed != null) {
63cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                final int N = op.removed.size();
64cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                mOps[pos++] = N;
65cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                for (int i=0; i<N; i++) {
66cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    mOps[pos++] = op.removed.get(i).mIndex;
67cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                }
68cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            } else {
69cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                mOps[pos++] = 0;
70cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            }
71cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            op = op.next;
72cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
73cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mTransition = bse.mTransition;
74cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mTransitionStyle = bse.mTransitionStyle;
75cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mName = bse.mName;
76cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mIndex = bse.mIndex;
77cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbTitleRes = bse.mBreadCrumbTitleRes;
78cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbTitleText = bse.mBreadCrumbTitleText;
79cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbShortTitleRes = bse.mBreadCrumbShortTitleRes;
80cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbShortTitleText = bse.mBreadCrumbShortTitleText;
81cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
82cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
83cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public BackStackState(Parcel in) {
84cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mOps = in.createIntArray();
85cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mTransition = in.readInt();
86cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mTransitionStyle = in.readInt();
87cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mName = in.readString();
88cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mIndex = in.readInt();
89cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbTitleRes = in.readInt();
90cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbTitleText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
91cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbShortTitleRes = in.readInt();
92cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbShortTitleText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
93cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
94cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
95cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public BackStackRecord instantiate(FragmentManagerImpl fm) {
96cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        BackStackRecord bse = new BackStackRecord(fm);
97cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        int pos = 0;
983a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        int num = 0;
99cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        while (pos < mOps.length) {
100cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            BackStackRecord.Op op = new BackStackRecord.Op();
101cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            op.cmd = mOps[pos++];
102cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG,
1033a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    "Instantiate " + bse + " op #" + num + " base fragment #" + mOps[pos]);
1045506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn            int findex = mOps[pos++];
1055506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn            if (findex >= 0) {
1065506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                Fragment f = fm.mActive.get(findex);
1075506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                op.fragment = f;
1085506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn            } else {
1095506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                op.fragment = null;
1105506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn            }
111cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            op.enterAnim = mOps[pos++];
112cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            op.exitAnim = mOps[pos++];
113df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn            op.popEnterAnim = mOps[pos++];
114df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn            op.popExitAnim = mOps[pos++];
115cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            final int N = mOps[pos++];
116cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            if (N > 0) {
117cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                op.removed = new ArrayList<Fragment>(N);
118cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                for (int i=0; i<N; i++) {
119cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG,
1203a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                            "Instantiate " + bse + " set remove fragment #" + mOps[pos]);
121cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    Fragment r = fm.mActive.get(mOps[pos++]);
122cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    op.removed.add(r);
123cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                }
124cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            }
125cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            bse.addOp(op);
1263a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            num++;
127cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
128cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        bse.mTransition = mTransition;
129cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        bse.mTransitionStyle = mTransitionStyle;
130cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        bse.mName = mName;
131cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        bse.mIndex = mIndex;
132cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        bse.mAddToBackStack = true;
133cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        bse.mBreadCrumbTitleRes = mBreadCrumbTitleRes;
134cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        bse.mBreadCrumbTitleText = mBreadCrumbTitleText;
135cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        bse.mBreadCrumbShortTitleRes = mBreadCrumbShortTitleRes;
136cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        bse.mBreadCrumbShortTitleText = mBreadCrumbShortTitleText;
137cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        bse.bumpBackStackNesting(1);
138cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return bse;
139cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
140cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
141cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public int describeContents() {
142cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return 0;
143cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
144cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
145cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
146cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        dest.writeIntArray(mOps);
147cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        dest.writeInt(mTransition);
148cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        dest.writeInt(mTransitionStyle);
149cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        dest.writeString(mName);
150cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        dest.writeInt(mIndex);
151cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        dest.writeInt(mBreadCrumbTitleRes);
152cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        TextUtils.writeToParcel(mBreadCrumbTitleText, dest, 0);
153cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        dest.writeInt(mBreadCrumbShortTitleRes);
154cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        TextUtils.writeToParcel(mBreadCrumbShortTitleText, dest, 0);
155cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
156cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
157cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public static final Parcelable.Creator<BackStackState> CREATOR
158cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            = new Parcelable.Creator<BackStackState>() {
159cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        public BackStackState createFromParcel(Parcel in) {
160cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            return new BackStackState(in);
161cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
162cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
163cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        public BackStackState[] newArray(int size) {
164cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            return new BackStackState[size];
165cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
166cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    };
167cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn}
168cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
169cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn/**
170cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @hide Entry of an operation on the fragment back stack.
171cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */
172cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornfinal class BackStackRecord extends FragmentTransaction implements
173cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        FragmentManager.BackStackEntry, Runnable {
1743a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn    static final String TAG = FragmentManagerImpl.TAG;
175cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
176cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    final FragmentManagerImpl mManager;
177cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
178cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    static final int OP_NULL = 0;
179cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    static final int OP_ADD = 1;
180cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    static final int OP_REPLACE = 2;
181cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    static final int OP_REMOVE = 3;
182cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    static final int OP_HIDE = 4;
183cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    static final int OP_SHOW = 5;
184eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    static final int OP_DETACH = 6;
185eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    static final int OP_ATTACH = 7;
186cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
187cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    static final class Op {
188cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        Op next;
189cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        Op prev;
190cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        int cmd;
191cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        Fragment fragment;
192cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        int enterAnim;
193cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        int exitAnim;
194df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn        int popEnterAnim;
195df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn        int popExitAnim;
196cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        ArrayList<Fragment> removed;
197cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
198cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
199cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    Op mHead;
200cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    Op mTail;
201cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    int mNumOp;
202cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    int mEnterAnim;
203cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    int mExitAnim;
204df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn    int mPopEnterAnim;
205df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn    int mPopExitAnim;
206cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    int mTransition;
207cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    int mTransitionStyle;
208cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    boolean mAddToBackStack;
209cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    boolean mAllowAddToBackStack = true;
210cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    String mName;
211cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    boolean mCommitted;
2123a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn    int mIndex = -1;
213cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
214cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    int mBreadCrumbTitleRes;
215cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    CharSequence mBreadCrumbTitleText;
216cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    int mBreadCrumbShortTitleRes;
217cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    CharSequence mBreadCrumbShortTitleText;
218cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
2193a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn    @Override
2203a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn    public String toString() {
2213a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        StringBuilder sb = new StringBuilder(128);
2223a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        sb.append("BackStackEntry{");
2233a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        sb.append(Integer.toHexString(System.identityHashCode(this)));
2243a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        if (mIndex >= 0) {
2253a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            sb.append(" #");
2263a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            sb.append(mIndex);
227df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn        }
2283a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        if (mName != null) {
2293a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            sb.append(" ");
2303a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            sb.append(mName);
231cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
2323a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        sb.append("}");
2333a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        return sb.toString();
2343a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn    }
2353a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn
2363a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
2373a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        dump(prefix, writer, true);
2383a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn    }
2393a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn
2403a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn    public void dump(String prefix, PrintWriter writer, boolean full) {
2413a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        if (full) {
2423a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            writer.print(prefix); writer.print("mName="); writer.print(mName);
2433a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    writer.print(" mIndex="); writer.print(mIndex);
2443a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    writer.print(" mCommitted="); writer.println(mCommitted);
2453a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            if (mTransition != FragmentTransaction.TRANSIT_NONE) {
2463a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                writer.print(prefix); writer.print("mTransition=#");
2473a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(Integer.toHexString(mTransition));
2483a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(" mTransitionStyle=#");
2493a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.println(Integer.toHexString(mTransitionStyle));
2503a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            }
2513a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            if (mEnterAnim != 0 || mExitAnim !=0) {
2523a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                writer.print(prefix); writer.print("mEnterAnim=#");
2533a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(Integer.toHexString(mEnterAnim));
2543a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(" mExitAnim=#");
2553a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.println(Integer.toHexString(mExitAnim));
2563a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            }
2573a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            if (mPopEnterAnim != 0 || mPopExitAnim !=0) {
2583a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                writer.print(prefix); writer.print("mPopEnterAnim=#");
2593a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(Integer.toHexString(mPopEnterAnim));
2603a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(" mPopExitAnim=#");
2613a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.println(Integer.toHexString(mPopExitAnim));
2623a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            }
2633a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            if (mBreadCrumbTitleRes != 0 || mBreadCrumbTitleText != null) {
2643a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                writer.print(prefix); writer.print("mBreadCrumbTitleRes=#");
2653a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(Integer.toHexString(mBreadCrumbTitleRes));
2663a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(" mBreadCrumbTitleText=");
2673a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.println(mBreadCrumbTitleText);
2683a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            }
2693a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            if (mBreadCrumbShortTitleRes != 0 || mBreadCrumbShortTitleText != null) {
2703a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                writer.print(prefix); writer.print("mBreadCrumbShortTitleRes=#");
2713a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(Integer.toHexString(mBreadCrumbShortTitleRes));
2723a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(" mBreadCrumbShortTitleText=");
2733a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.println(mBreadCrumbShortTitleText);
2743a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            }
275cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
276cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
277cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (mHead != null) {
278cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            writer.print(prefix); writer.println("Operations:");
279cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            String innerPrefix = prefix + "    ";
280cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            Op op = mHead;
281cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            int num = 0;
282cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            while (op != null) {
2833a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                String cmdStr;
2843a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                switch (op.cmd) {
2853a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    case OP_NULL: cmdStr="NULL"; break;
2863a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    case OP_ADD: cmdStr="ADD"; break;
2873a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    case OP_REPLACE: cmdStr="REPLACE"; break;
2883a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    case OP_REMOVE: cmdStr="REMOVE"; break;
2893a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    case OP_HIDE: cmdStr="HIDE"; break;
2903a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    case OP_SHOW: cmdStr="SHOW"; break;
2913a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    case OP_DETACH: cmdStr="DETACH"; break;
2923a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    case OP_ATTACH: cmdStr="ATTACH"; break;
2933a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    default: cmdStr="cmd=" + op.cmd; break;
294df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn                }
2953a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                writer.print(prefix); writer.print("  Op #"); writer.print(num);
2963a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(": "); writer.print(cmdStr);
2973a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(" "); writer.println(op.fragment);
2983a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                if (full) {
2993a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    if (op.enterAnim != 0 || op.exitAnim != 0) {
3003a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(prefix); writer.print("enterAnim=#");
3013a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                                writer.print(Integer.toHexString(op.enterAnim));
3023a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                                writer.print(" exitAnim=#");
3033a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                                writer.println(Integer.toHexString(op.exitAnim));
3043a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    }
3053a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    if (op.popEnterAnim != 0 || op.popExitAnim != 0) {
3063a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                        writer.print(prefix); writer.print("popEnterAnim=#");
3073a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                                writer.print(Integer.toHexString(op.popEnterAnim));
3083a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                                writer.print(" popExitAnim=#");
3093a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                                writer.println(Integer.toHexString(op.popExitAnim));
3103a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                    }
311cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                }
312cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                if (op.removed != null && op.removed.size() > 0) {
313cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    for (int i=0; i<op.removed.size(); i++) {
314cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        writer.print(innerPrefix);
315cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        if (op.removed.size() == 1) {
316cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                            writer.print("Removed: ");
317cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        } else {
3183a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                            if (i == 0) {
3193a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                                writer.println("Removed:");
3203a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                            }
3213a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                            writer.print(innerPrefix); writer.print("  #"); writer.print(i);
322cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                                    writer.print(": ");
323cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        }
324cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        writer.println(op.removed.get(i));
325cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    }
326cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                }
327cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                op = op.next;
3283a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn                num++;
329cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            }
330cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
331cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
332cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
333cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public BackStackRecord(FragmentManagerImpl manager) {
334cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mManager = manager;
335cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
336cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
337cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public int getId() {
338cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return mIndex;
339cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
340cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
341cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public int getBreadCrumbTitleRes() {
342cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return mBreadCrumbTitleRes;
343cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
344cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
345cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public int getBreadCrumbShortTitleRes() {
346cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return mBreadCrumbShortTitleRes;
347cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
348cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
349cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public CharSequence getBreadCrumbTitle() {
350cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (mBreadCrumbTitleRes != 0) {
351cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            return mManager.mActivity.getText(mBreadCrumbTitleRes);
352cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
353cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return mBreadCrumbTitleText;
354cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
355cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
356cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public CharSequence getBreadCrumbShortTitle() {
357cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (mBreadCrumbShortTitleRes != 0) {
358cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            return mManager.mActivity.getText(mBreadCrumbShortTitleRes);
359cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
360cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return mBreadCrumbShortTitleText;
361cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
362cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
363cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    void addOp(Op op) {
364cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (mHead == null) {
365cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            mHead = mTail = op;
366cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        } else {
367cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            op.prev = mTail;
368cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            mTail.next = op;
369cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            mTail = op;
370cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
371cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        op.enterAnim = mEnterAnim;
372cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        op.exitAnim = mExitAnim;
373df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn        op.popEnterAnim = mPopEnterAnim;
374df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn        op.popExitAnim = mPopExitAnim;
375cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mNumOp++;
376cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
377cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
378cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction add(Fragment fragment, String tag) {
379cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        doAddOp(0, fragment, tag, OP_ADD);
380cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
381cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
382cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
383cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction add(int containerViewId, Fragment fragment) {
384cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        doAddOp(containerViewId, fragment, null, OP_ADD);
385cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
386cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
387cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
388cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction add(int containerViewId, Fragment fragment, String tag) {
389cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        doAddOp(containerViewId, fragment, tag, OP_ADD);
390cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
391cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
392cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
393cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    private void doAddOp(int containerViewId, Fragment fragment, String tag, int opcmd) {
394cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        fragment.mFragmentManager = mManager;
395cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
396cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (tag != null) {
397cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            if (fragment.mTag != null && !tag.equals(fragment.mTag)) {
398cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                throw new IllegalStateException("Can't change tag of fragment "
399cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        + fragment + ": was " + fragment.mTag
400cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        + " now " + tag);
401cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            }
402cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            fragment.mTag = tag;
403cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
404cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
405cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (containerViewId != 0) {
406cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            if (fragment.mFragmentId != 0 && fragment.mFragmentId != containerViewId) {
407cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                throw new IllegalStateException("Can't change container ID of fragment "
408cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        + fragment + ": was " + fragment.mFragmentId
409cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        + " now " + containerViewId);
410cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            }
411cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            fragment.mContainerId = fragment.mFragmentId = containerViewId;
412cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
413cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
414cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        Op op = new Op();
415cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        op.cmd = opcmd;
416cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        op.fragment = fragment;
417cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        addOp(op);
418cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
419cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
420cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction replace(int containerViewId, Fragment fragment) {
421cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return replace(containerViewId, fragment, null);
422cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
423cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
424cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction replace(int containerViewId, Fragment fragment, String tag) {
425cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (containerViewId == 0) {
426cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            throw new IllegalArgumentException("Must use non-zero containerViewId");
427cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
428cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
429cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        doAddOp(containerViewId, fragment, tag, OP_REPLACE);
430cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
431cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
432cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
433cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction remove(Fragment fragment) {
434cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        Op op = new Op();
435cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        op.cmd = OP_REMOVE;
436cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        op.fragment = fragment;
437cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        addOp(op);
438cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
439cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
440cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
441cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
442cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction hide(Fragment fragment) {
443cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        Op op = new Op();
444cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        op.cmd = OP_HIDE;
445cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        op.fragment = fragment;
446cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        addOp(op);
447cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
448cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
449cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
450cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
451cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction show(Fragment fragment) {
452cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        Op op = new Op();
453cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        op.cmd = OP_SHOW;
454cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        op.fragment = fragment;
455cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        addOp(op);
456cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
457cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
458cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
459cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
460eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public FragmentTransaction detach(Fragment fragment) {
461eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        Op op = new Op();
462eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        op.cmd = OP_DETACH;
463eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        op.fragment = fragment;
464eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        addOp(op);
465eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
466eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        return this;
467eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    }
468eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
469eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public FragmentTransaction attach(Fragment fragment) {
470eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        Op op = new Op();
471eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        op.cmd = OP_ATTACH;
472eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        op.fragment = fragment;
473eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        addOp(op);
474eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
475eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        return this;
476eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    }
477eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
478cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction setCustomAnimations(int enter, int exit) {
479df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn        return setCustomAnimations(enter, exit, 0, 0);
480df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn    }
481df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn
482df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn    public FragmentTransaction setCustomAnimations(int enter, int exit,
483df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn            int popEnter, int popExit) {
484cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mEnterAnim = enter;
485cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mExitAnim = exit;
486df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn        mPopEnterAnim = popEnter;
487df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn        mPopExitAnim = popExit;
488cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
489cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
490cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
491cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction setTransition(int transition) {
492cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mTransition = transition;
493cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
494cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
495cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
496cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction setTransitionStyle(int styleRes) {
497cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mTransitionStyle = styleRes;
498cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
499cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
500cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
501cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction addToBackStack(String name) {
502cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (!mAllowAddToBackStack) {
503cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            throw new IllegalStateException(
504cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    "This FragmentTransaction is not allowed to be added to the back stack.");
505cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
506cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mAddToBackStack = true;
507cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mName = name;
508cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
509cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
510cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
511cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public boolean isAddToBackStackAllowed() {
512cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return mAllowAddToBackStack;
513cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
514cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
515cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction disallowAddToBackStack() {
516cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (mAddToBackStack) {
517cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            throw new IllegalStateException(
518cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    "This transaction is already being added to the back stack");
519cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
520cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mAllowAddToBackStack = false;
521cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
522cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
523cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
524cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction setBreadCrumbTitle(int res) {
525cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbTitleRes = res;
526cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbTitleText = null;
527cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
528cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
529cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
530cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction setBreadCrumbTitle(CharSequence text) {
531cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbTitleRes = 0;
532cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbTitleText = text;
533cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
534cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
535cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
536cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction setBreadCrumbShortTitle(int res) {
537cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbShortTitleRes = res;
538cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbShortTitleText = null;
539cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
540cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
541cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
542cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public FragmentTransaction setBreadCrumbShortTitle(CharSequence text) {
543cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbShortTitleRes = 0;
544cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mBreadCrumbShortTitleText = text;
545cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return this;
546cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
547cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
548cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    void bumpBackStackNesting(int amt) {
549cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (!mAddToBackStack) {
550cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            return;
551cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
552cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting in " + this
553cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                + " by " + amt);
554cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        Op op = mHead;
555cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        while (op != null) {
5565506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn            if (op.fragment != null) {
5575506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                op.fragment.mBackStackNesting += amt;
5585506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of "
5595506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                        + op.fragment + " to " + op.fragment.mBackStackNesting);
5605506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn            }
561cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            if (op.removed != null) {
562cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                for (int i=op.removed.size()-1; i>=0; i--) {
563cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    Fragment r = op.removed.get(i);
564cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    r.mBackStackNesting += amt;
565cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of "
566cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                            + r + " to " + r.mBackStackNesting);
567cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                }
568cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            }
569cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            op = op.next;
570cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
571cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
572cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
573cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public int commit() {
574cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return commitInternal(false);
575cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
576cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
577cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public int commitAllowingStateLoss() {
578cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return commitInternal(true);
579cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
580cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
581cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    int commitInternal(boolean allowStateLoss) {
582cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (mCommitted) throw new IllegalStateException("commit already called");
5833a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        if (FragmentManagerImpl.DEBUG) {
5843a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            Log.v(TAG, "Commit: " + this);
5853a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            LogWriter logw = new LogWriter(TAG);
5863a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            PrintWriter pw = new PrintWriter(logw);
5873a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            dump("  ", null, pw, null);
5883a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        }
589cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mCommitted = true;
590cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (mAddToBackStack) {
591cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            mIndex = mManager.allocBackStackIndex(this);
592cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        } else {
593cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            mIndex = -1;
594cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
595cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mManager.enqueueAction(this, allowStateLoss);
596cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return mIndex;
597cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
598cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
599cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public void run() {
600cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Run: " + this);
601cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
602cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (mAddToBackStack) {
603cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            if (mIndex < 0) {
604cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                throw new IllegalStateException("addToBackStack() called after commit()");
605cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            }
606cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
607cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
608cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        bumpBackStackNesting(1);
609cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
610cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        Op op = mHead;
611cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        while (op != null) {
612cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            switch (op.cmd) {
613cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                case OP_ADD: {
614cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    Fragment f = op.fragment;
615cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    f.mNextAnim = op.enterAnim;
616cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    mManager.addFragment(f, false);
617cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                } break;
618cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                case OP_REPLACE: {
619cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    Fragment f = op.fragment;
620cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    if (mManager.mAdded != null) {
621cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        for (int i=0; i<mManager.mAdded.size(); i++) {
622cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                            Fragment old = mManager.mAdded.get(i);
623cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                            if (FragmentManagerImpl.DEBUG) Log.v(TAG,
624cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                                    "OP_REPLACE: adding=" + f + " old=" + old);
6255506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                            if (f == null || old.mContainerId == f.mContainerId) {
6265506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                if (old == f) {
6275506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                    op.fragment = f = null;
6285506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                } else {
6295506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                    if (op.removed == null) {
6305506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                        op.removed = new ArrayList<Fragment>();
6315506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                    }
6325506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                    op.removed.add(old);
6335506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                    old.mNextAnim = op.exitAnim;
6345506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                    if (mAddToBackStack) {
6355506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                        old.mBackStackNesting += 1;
6365506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of "
6375506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                                + old + " to " + old.mBackStackNesting);
6385506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                    }
6395506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                    mManager.removeFragment(old, mTransition, mTransitionStyle);
640cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                                }
641cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                            }
642cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        }
643cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    }
6445506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                    if (f != null) {
6455506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                        f.mNextAnim = op.enterAnim;
6465506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                        mManager.addFragment(f, false);
6475506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                    }
648cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                } break;
649cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                case OP_REMOVE: {
650cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    Fragment f = op.fragment;
651cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    f.mNextAnim = op.exitAnim;
652cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    mManager.removeFragment(f, mTransition, mTransitionStyle);
653cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                } break;
654cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                case OP_HIDE: {
655cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    Fragment f = op.fragment;
656cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    f.mNextAnim = op.exitAnim;
657cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    mManager.hideFragment(f, mTransition, mTransitionStyle);
658cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                } break;
659cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                case OP_SHOW: {
660cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    Fragment f = op.fragment;
661cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    f.mNextAnim = op.enterAnim;
662cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    mManager.showFragment(f, mTransition, mTransitionStyle);
663cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                } break;
664eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                case OP_DETACH: {
665eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                    Fragment f = op.fragment;
666eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                    f.mNextAnim = op.exitAnim;
667eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                    mManager.detachFragment(f, mTransition, mTransitionStyle);
668eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                } break;
669eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                case OP_ATTACH: {
670eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                    Fragment f = op.fragment;
671eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                    f.mNextAnim = op.enterAnim;
672eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                    mManager.attachFragment(f, mTransition, mTransitionStyle);
673eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                } break;
674cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                default: {
675cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    throw new IllegalArgumentException("Unknown cmd: " + op.cmd);
676cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                }
677cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            }
678cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
679cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            op = op.next;
680cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
681cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
682cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        mManager.moveToState(mManager.mCurState, mTransition,
683cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                mTransitionStyle, true);
684cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
685cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (mAddToBackStack) {
686cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            mManager.addBackStackState(this);
687cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
688cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
689cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
690cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public void popFromBackStack(boolean doStateMove) {
6913a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        if (FragmentManagerImpl.DEBUG) {
6923a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            Log.v(TAG, "popFromBackStack: " + this);
6933a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            LogWriter logw = new LogWriter(TAG);
6943a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            PrintWriter pw = new PrintWriter(logw);
6953a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn            dump("  ", null, pw, null);
6963a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn        }
697cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
698cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        bumpBackStackNesting(-1);
699cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
700cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        Op op = mTail;
701cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        while (op != null) {
702cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            switch (op.cmd) {
703cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                case OP_ADD: {
704cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    Fragment f = op.fragment;
705df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn                    f.mNextAnim = op.popExitAnim;
706cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    mManager.removeFragment(f,
707cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                            FragmentManagerImpl.reverseTransit(mTransition),
708cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                            mTransitionStyle);
709cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                } break;
710cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                case OP_REPLACE: {
711cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    Fragment f = op.fragment;
7125506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                    if (f != null) {
7135506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                        f.mNextAnim = op.popExitAnim;
7145506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                        mManager.removeFragment(f,
7155506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                FragmentManagerImpl.reverseTransit(mTransition),
7165506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                                mTransitionStyle);
7175506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn                    }
718cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    if (op.removed != null) {
719cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        for (int i=0; i<op.removed.size(); i++) {
720cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                            Fragment old = op.removed.get(i);
721df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn                            old.mNextAnim = op.popEnterAnim;
722cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                            mManager.addFragment(old, false);
723cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                        }
724cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    }
725cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                } break;
726cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                case OP_REMOVE: {
727cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    Fragment f = op.fragment;
728df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn                    f.mNextAnim = op.popEnterAnim;
729cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    mManager.addFragment(f, false);
730cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                } break;
731cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                case OP_HIDE: {
732cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    Fragment f = op.fragment;
733df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn                    f.mNextAnim = op.popEnterAnim;
734cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    mManager.showFragment(f,
735cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                            FragmentManagerImpl.reverseTransit(mTransition), mTransitionStyle);
736cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                } break;
737cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                case OP_SHOW: {
738cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    Fragment f = op.fragment;
739df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn                    f.mNextAnim = op.popExitAnim;
740cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    mManager.hideFragment(f,
741cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                            FragmentManagerImpl.reverseTransit(mTransition), mTransitionStyle);
742cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                } break;
743eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                case OP_DETACH: {
744eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                    Fragment f = op.fragment;
745df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn                    f.mNextAnim = op.popEnterAnim;
746eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                    mManager.attachFragment(f,
747eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                            FragmentManagerImpl.reverseTransit(mTransition), mTransitionStyle);
748eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                } break;
749eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                case OP_ATTACH: {
750eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                    Fragment f = op.fragment;
751df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn                    f.mNextAnim = op.popEnterAnim;
752eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                    mManager.detachFragment(f,
753eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                            FragmentManagerImpl.reverseTransit(mTransition), mTransitionStyle);
754eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                } break;
755cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                default: {
756cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    throw new IllegalArgumentException("Unknown cmd: " + op.cmd);
757cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                }
758cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            }
759cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
760cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            op = op.prev;
761cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
762cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
763cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (doStateMove) {
764cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            mManager.moveToState(mManager.mCurState,
765cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn                    FragmentManagerImpl.reverseTransit(mTransition), mTransitionStyle, true);
766cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
767cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
768cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        if (mIndex >= 0) {
769cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            mManager.freeBackStackIndex(mIndex);
770cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn            mIndex = -1;
771cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        }
772cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
773cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
774cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public String getName() {
775cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return mName;
776cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
777cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
778cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public int getTransition() {
779cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return mTransition;
780cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
781cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
782cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public int getTransitionStyle() {
783cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return mTransitionStyle;
784cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
785cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn
786cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    public boolean isEmpty() {
787cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn        return mNumOp == 0;
788cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn    }
789cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn}
790