StackBox.java revision 00af9fe6ae0da5b716212fa754163d90b60c1ee6
1c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner/*
2c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * Copyright (C) 2013 The Android Open Source Project
3c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner *
4c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License");
5c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * you may not use this file except in compliance with the License.
6c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * You may obtain a copy of the License at
7c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner *
8c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner *      http://www.apache.org/licenses/LICENSE-2.0
9c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner *
10c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * Unless required by applicable law or agreed to in writing, software
11c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS,
12c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * See the License for the specific language governing permissions and
14c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * limitations under the License.
15c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner */
16c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
17c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautnerpackage com.android.server.wm;
18c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
19c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautnerimport android.graphics.Rect;
20c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
2100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautnerimport java.io.PrintWriter;
22d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautnerimport java.util.ArrayList;
23d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner
24c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautnerpublic class StackBox {
25c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    /** For use with {@link WindowManagerService#createStack} */
26c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    public static final int TASK_STACK_GOES_BEFORE = 0;
27c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    public static final int TASK_STACK_GOES_AFTER = 1;
28c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    public static final int TASK_STACK_GOES_ABOVE = 2;
29c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    public static final int TASK_STACK_GOES_BELOW = 3;
30c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    public static final int TASK_STACK_GOES_OVER = 4;
31c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    public static final int TASK_STACK_GOES_UNDER = 5;
32c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
3300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** The display this box sits in. */
34c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    final DisplayContent mDisplayContent;
3500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
3600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Non-null indicates this is mFirst or mSecond of a parent StackBox. Null indicates this
3700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * is this entire size of mDisplayContent. */
38c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    StackBox mParent;
3900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
4000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** First child, this is null exactly when mStack is non-null. */
41c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    StackBox mFirst;
4200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
4300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Second child, this is null exactly when mStack is non-null. */
44c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    StackBox mSecond;
4500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
4600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Stack of Tasks, this is null exactly when mFirst and mSecond are non-null. */
47c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    TaskStack mStack;
4800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
4900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Content limits relative to the DisplayContent this sits in. */
50c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    Rect mBounds;
5100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
5200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Relative orientation of mFirst and mSecond. */
5300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    boolean mVertical;
5400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
5500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Dirty flag. Something inside this or some descendant of this has changed. */
56c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    boolean layoutNeeded;
5700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
5800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Used to keep from reallocating a temporary array to hold the list of Tasks below */
59d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner    ArrayList<Task> mTmpTasks = new ArrayList<Task>();
60c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
61c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    StackBox(DisplayContent displayContent, Rect bounds) {
62c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        mDisplayContent = displayContent;
63c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        mBounds = bounds;
64c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
65c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
66c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    /** Propagate #layoutNeeded bottom up. */
67c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    void makeDirty() {
68c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        layoutNeeded = true;
69c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        if (mParent != null) {
70c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            mParent.makeDirty();
71c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
72c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
73c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
74c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    /** Propagate #layoutNeeded top down. */
75c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    void makeClean() {
76c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        layoutNeeded = false;
77c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        if (mFirst != null) {
78c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            mFirst.makeClean();
79c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            mSecond.makeClean();
80c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
81c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
82c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
8300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /**
8400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * Detremine if a particular TaskStack is in this StackBox or any of its descendants.
8500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @param stackId The TaskStack being considered.
8600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @return true if the specified TaskStack is in this box or its descendants. False otherwise.
8700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     */
8800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    boolean contains(int stackId) {
8900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        if (mStack != null) {
9000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            return mStack.mStackId == stackId;
9100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        }
9200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        return mFirst.contains(stackId) || mSecond.contains(stackId);
9300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    }
9400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
9500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /**
9600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * Create a new TaskStack relative to a specified one by splitting the StackBox containing
9700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * the specified TaskStack into two children. The size and position each of the new StackBoxes
9800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * is determined by the passed parameters.
9900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @param stackId The id of the new TaskStack to create.
10000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @param relativeStackId The id of the TaskStack to place the new one next to.
10100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @param position One of the static TASK_STACK_GOES_xxx positions defined in this class.
10200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @param weight The percentage size of the parent StackBox to devote to the new TaskStack.
10300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @return The new TaskStack.
10400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     */
105c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    TaskStack split(int stackId, int relativeStackId, int position, float weight) {
106c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        if (mStack != null) {
107c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            if (mStack.mStackId == relativeStackId) {
108c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                // Found it!
109c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                TaskStack stack = new TaskStack(stackId, this);
110c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                TaskStack firstStack;
111c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                TaskStack secondStack;
112c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                int width, height, split;
113c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                switch (position) {
114c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                    default:
115c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                    case TASK_STACK_GOES_BEFORE:
116c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                    case TASK_STACK_GOES_AFTER:
117c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        mVertical = false;
118c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        width = (int)(weight * mBounds.width());
119c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        height = mBounds.height();
120c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        if (position == TASK_STACK_GOES_BEFORE) {
121c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            firstStack = stack;
122c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            secondStack = mStack;
123c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            split = mBounds.left + width;
124c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        } else {
125c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            firstStack = mStack;
126c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            secondStack = stack;
127c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            split = mBounds.right - width;
128c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        }
129c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        break;
130c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                    case TASK_STACK_GOES_ABOVE:
131c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                    case TASK_STACK_GOES_BELOW:
132c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        mVertical = true;
133c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        width = mBounds.width();
134c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        height = (int)(weight * mBounds.height());
135c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        if (position == TASK_STACK_GOES_ABOVE) {
136c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            firstStack = stack;
137c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            secondStack = mStack;
138c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            split = mBounds.top + height;
139c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        } else {
140c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            firstStack = mStack;
141c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            secondStack = stack;
142c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            split = mBounds.bottom - height;
143c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        }
144c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        break;
145c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                }
146c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                mFirst = new StackBox(mDisplayContent, new Rect(mBounds.left, mBounds.top,
147c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        mVertical ? mBounds.right : split, mVertical ? split : mBounds.bottom));
148c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                mFirst.mStack = firstStack;
149c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                mSecond = new StackBox(mDisplayContent, new Rect(mVertical ? mBounds.left : split,
150c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        mVertical ? split : mBounds.top, mBounds.right, mBounds.bottom));
151c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                mSecond.mStack = secondStack;
152c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                mStack = null;
153c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                return stack;
154c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            }
15500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            // Not the intended TaskStack.
156c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            return null;
157c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
158c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
159c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        // Propagate the split to see if the target task stack is in either sub box.
160c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        TaskStack stack = mFirst.split(stackId, relativeStackId, position, weight);
161c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        if (stack != null) {
162c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            return stack;
163c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
164c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        return mSecond.split(stackId, relativeStackId, position, weight);
165c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
166c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
16700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /**
16800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @return List of all Tasks underneath this StackBox. The order is currently mFirst followed
16900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * by mSecond putting mSecond Tasks more recent than mFirst Tasks.
17000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * TODO: Change to MRU ordering.
17100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     */
172d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner    ArrayList<Task> getTasks() {
173d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner        mTmpTasks.clear();
174d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner        if (mStack != null) {
175d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner            mTmpTasks.addAll(mStack.getTasks());
176d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner        } else {
177d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner            mTmpTasks.addAll(mFirst.getTasks());
178d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner            mTmpTasks.addAll(mSecond.getTasks());
179d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner        }
180d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner        return mTmpTasks;
181d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner    }
182d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner
18300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Combine a child StackBox into its parent.
18400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @param child The surviving child to be merge up into this StackBox. */
18500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    void absorb(StackBox child) {
18600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        mFirst = child.mFirst;
18700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        mSecond = child.mSecond;
18800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        mStack = child.mStack;
189c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        layoutNeeded = true;
190c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
191c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
19200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Return the stackId of the first mFirst StackBox with a non-null mStack */
19300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    int getStackId() {
19400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        if (mStack != null) {
19500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            return mStack.mStackId;
196c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
19700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        return mFirst.getStackId();
198c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
199c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
20000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Remove this box and propagate its sibling's content up to their parent.
20100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @return The first stackId of the resulting StackBox. */
20200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    int removeStack() {
20300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        if (mParent.mFirst == this) {
20400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            mParent.absorb(mParent.mSecond);
20500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        } else {
20600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            mParent.absorb(mParent.mFirst);
207c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
20800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        mParent.makeDirty();
20900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        return getStackId();
210c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
211c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
21200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** TODO: */
213c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    boolean resize(int stackId, float weight) {
214c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        return false;
215c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
21600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
21700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    public void dump(String prefix, PrintWriter pw) {
21800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        pw.print(prefix); pw.print("mParent="); pw.println(mParent);
21900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        pw.print(prefix); pw.print("mFirst="); pw.println(mFirst);
22000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        pw.print(prefix); pw.print("mSecond="); pw.println(mSecond);
22100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        pw.print(prefix); pw.print("mBounds="); pw.print(mBounds.toShortString());
22200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            pw.print("mVertical="); pw.print(mVertical);
22300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            pw.print("layoutNeeded="); pw.println(layoutNeeded);
22400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        if (mStack != null) {
22500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            pw.print(prefix); pw.print("mStack="); pw.println(mStack);
22600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            mStack.dump(prefix + "  ", pw);
22700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        } else {
22800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            pw.print(prefix); pw.print("mFirst="); pw.println(mStack);
22900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            mFirst.dump(prefix + "  ", pw);
23000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            pw.print(prefix); pw.print("mSecond="); pw.println(mStack);
23100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            mSecond.dump(prefix + "  ", pw);
23200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        }
23300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    }
234c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner}
235