StackBox.java revision 9e4f28cfa157fff89e42859edc9cce546508491f
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
219e4f28cfa157fff89e42859edc9cce546508491fCraig Mautnerimport static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;
229e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner
2300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautnerimport java.io.PrintWriter;
24d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautnerimport java.util.ArrayList;
25d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner
26c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautnerpublic class StackBox {
27c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    /** For use with {@link WindowManagerService#createStack} */
28c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    public static final int TASK_STACK_GOES_BEFORE = 0;
29c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    public static final int TASK_STACK_GOES_AFTER = 1;
30c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    public static final int TASK_STACK_GOES_ABOVE = 2;
31c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    public static final int TASK_STACK_GOES_BELOW = 3;
32c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    public static final int TASK_STACK_GOES_OVER = 4;
33c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    public static final int TASK_STACK_GOES_UNDER = 5;
34c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
3500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** The display this box sits in. */
36c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    final DisplayContent mDisplayContent;
3700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
3800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Non-null indicates this is mFirst or mSecond of a parent StackBox. Null indicates this
3900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * is this entire size of mDisplayContent. */
40c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    StackBox mParent;
4100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
4200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** First child, this is null exactly when mStack is non-null. */
43c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    StackBox mFirst;
4400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
4500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Second child, this is null exactly when mStack is non-null. */
46c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    StackBox mSecond;
4700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
4800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Stack of Tasks, this is null exactly when mFirst and mSecond are non-null. */
49c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    TaskStack mStack;
5000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
5100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Content limits relative to the DisplayContent this sits in. */
52c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    Rect mBounds;
5300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
5400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Relative orientation of mFirst and mSecond. */
5500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    boolean mVertical;
5600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
5700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Dirty flag. Something inside this or some descendant of this has changed. */
58c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    boolean layoutNeeded;
5900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
6000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Used to keep from reallocating a temporary array to hold the list of Tasks below */
61d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner    ArrayList<Task> mTmpTasks = new ArrayList<Task>();
62c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
63c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    StackBox(DisplayContent displayContent, Rect bounds) {
64c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        mDisplayContent = displayContent;
65c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        mBounds = bounds;
66c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
67c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
68c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    /** Propagate #layoutNeeded bottom up. */
69c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    void makeDirty() {
70c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        layoutNeeded = true;
71c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        if (mParent != null) {
72c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            mParent.makeDirty();
73c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
74c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
75c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
76c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    /** Propagate #layoutNeeded top down. */
77c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    void makeClean() {
78c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        layoutNeeded = false;
79c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        if (mFirst != null) {
80c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            mFirst.makeClean();
81c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            mSecond.makeClean();
82c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
83c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
84c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
8500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /**
8600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * Detremine if a particular TaskStack is in this StackBox or any of its descendants.
8700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @param stackId The TaskStack being considered.
8800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @return true if the specified TaskStack is in this box or its descendants. False otherwise.
8900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     */
9000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    boolean contains(int stackId) {
9100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        if (mStack != null) {
9200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            return mStack.mStackId == stackId;
9300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        }
9400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        return mFirst.contains(stackId) || mSecond.contains(stackId);
9500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    }
9600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
9700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /**
9800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * Create a new TaskStack relative to a specified one by splitting the StackBox containing
9900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * the specified TaskStack into two children. The size and position each of the new StackBoxes
10000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * is determined by the passed parameters.
10100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @param stackId The id of the new TaskStack to create.
10200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @param relativeStackId The id of the TaskStack to place the new one next to.
10300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @param position One of the static TASK_STACK_GOES_xxx positions defined in this class.
10400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @param weight The percentage size of the parent StackBox to devote to the new TaskStack.
10500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @return The new TaskStack.
10600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     */
107c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    TaskStack split(int stackId, int relativeStackId, int position, float weight) {
108c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        if (mStack != null) {
109c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            if (mStack.mStackId == relativeStackId) {
110c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                // Found it!
111c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                TaskStack stack = new TaskStack(stackId, this);
112c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                TaskStack firstStack;
113c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                TaskStack secondStack;
114c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                int width, height, split;
115c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                switch (position) {
116c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                    default:
117c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                    case TASK_STACK_GOES_BEFORE:
118c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                    case TASK_STACK_GOES_AFTER:
119c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        mVertical = false;
120c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        width = (int)(weight * mBounds.width());
121c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        height = mBounds.height();
122c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        if (position == TASK_STACK_GOES_BEFORE) {
123c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            firstStack = stack;
124c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            secondStack = mStack;
125c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            split = mBounds.left + width;
126c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        } else {
127c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            firstStack = mStack;
128c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            secondStack = stack;
129c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            split = mBounds.right - width;
130c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        }
131c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        break;
132c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                    case TASK_STACK_GOES_ABOVE:
133c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                    case TASK_STACK_GOES_BELOW:
134c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        mVertical = true;
135c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        width = mBounds.width();
136c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        height = (int)(weight * mBounds.height());
137c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        if (position == TASK_STACK_GOES_ABOVE) {
138c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            firstStack = stack;
139c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            secondStack = mStack;
140c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            split = mBounds.top + height;
141c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        } else {
142c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            firstStack = mStack;
143c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            secondStack = stack;
144c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                            split = mBounds.bottom - height;
145c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        }
146c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        break;
147c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                }
148c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                mFirst = new StackBox(mDisplayContent, new Rect(mBounds.left, mBounds.top,
149c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        mVertical ? mBounds.right : split, mVertical ? split : mBounds.bottom));
150c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                mFirst.mStack = firstStack;
151c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                mSecond = new StackBox(mDisplayContent, new Rect(mVertical ? mBounds.left : split,
152c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                        mVertical ? split : mBounds.top, mBounds.right, mBounds.bottom));
153c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                mSecond.mStack = secondStack;
154c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                mStack = null;
155c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner                return stack;
156c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            }
15700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            // Not the intended TaskStack.
158c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            return null;
159c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
160c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
161c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        // Propagate the split to see if the target task stack is in either sub box.
162c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        TaskStack stack = mFirst.split(stackId, relativeStackId, position, weight);
163c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        if (stack != null) {
164c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner            return stack;
165c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
166c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        return mSecond.split(stackId, relativeStackId, position, weight);
167c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
168c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
16900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /**
17000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @return List of all Tasks underneath this StackBox. The order is currently mFirst followed
17100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * by mSecond putting mSecond Tasks more recent than mFirst Tasks.
17200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * TODO: Change to MRU ordering.
17300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     */
174d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner    ArrayList<Task> getTasks() {
175d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner        mTmpTasks.clear();
176d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner        if (mStack != null) {
177d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner            mTmpTasks.addAll(mStack.getTasks());
178d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner        } else {
179d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner            mTmpTasks.addAll(mFirst.getTasks());
180d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner            mTmpTasks.addAll(mSecond.getTasks());
181d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner        }
182d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner        return mTmpTasks;
183d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner    }
184d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner
18500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Combine a child StackBox into its parent.
18600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @param child The surviving child to be merge up into this StackBox. */
18700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    void absorb(StackBox child) {
18800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        mFirst = child.mFirst;
18900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        mSecond = child.mSecond;
19000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        mStack = child.mStack;
191c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        layoutNeeded = true;
192c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
193c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
19400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Return the stackId of the first mFirst StackBox with a non-null mStack */
19500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    int getStackId() {
19600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        if (mStack != null) {
19700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            return mStack.mStackId;
198c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
19900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        return mFirst.getStackId();
200c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
201c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
20200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** Remove this box and propagate its sibling's content up to their parent.
20300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner     * @return The first stackId of the resulting StackBox. */
20400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    int removeStack() {
2059e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner        if (mParent == null) {
2069e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner            mDisplayContent.removeStackBox(this);
2079e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner            return HOME_STACK_ID;
2089e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner        }
20900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        if (mParent.mFirst == this) {
21000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            mParent.absorb(mParent.mSecond);
21100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        } else {
21200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            mParent.absorb(mParent.mFirst);
213c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
21400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        mParent.makeDirty();
21500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        return getStackId();
216c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
217c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
21800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    /** TODO: */
219c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    boolean resize(int stackId, float weight) {
220c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        return false;
221c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
22200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner
22300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    public void dump(String prefix, PrintWriter pw) {
22400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        pw.print(prefix); pw.print("mParent="); pw.println(mParent);
22500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        pw.print(prefix); pw.print("mFirst="); pw.println(mFirst);
22600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        pw.print(prefix); pw.print("mSecond="); pw.println(mSecond);
22700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        pw.print(prefix); pw.print("mBounds="); pw.print(mBounds.toShortString());
2289e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner            pw.print(" mVertical="); pw.print(mVertical);
2299e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner            pw.print(" layoutNeeded="); pw.println(layoutNeeded);
23000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        if (mStack != null) {
23100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            pw.print(prefix); pw.print("mStack="); pw.println(mStack);
23200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            mStack.dump(prefix + "  ", pw);
23300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        } else {
23400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            pw.print(prefix); pw.print("mFirst="); pw.println(mStack);
23500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            mFirst.dump(prefix + "  ", pw);
23600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            pw.print(prefix); pw.print("mSecond="); pw.println(mStack);
23700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner            mSecond.dump(prefix + "  ", pw);
23800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner        }
23900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner    }
240c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner}
241