The order of child windows is switched

By calling WindowManagerService#reAddWindowLocked(), the window object
in DisplayContent.mWindows is rearranged. If this window has children,
the window objects belonging to WindowState.mChildWindows are also
rearranged together. At this time, while DisplayContent.mWindows is
arranged in ascending order of Z-Order, WindowState.mChildWindows is
arranged in descending order. Therefore, if children
(= WindowState.mChildWindows) are added to DisplayContent.mWindows
in the original order, the order of children is switched. I think
that children must be sorted before they are added.

Change-Id: I28a506f17fcd99c801a3faa17cca66fffb291596
This commit is contained in:
takeda.masayuki
2012-12-12 11:06:24 +09:00
committed by Jean-Baptiste Queru
parent 2a26547fd3
commit 1873509153

View File

@@ -314,7 +314,32 @@ final class WindowState implements WindowManagerPolicy.WindowState {
mSubLayer = mPolicy.subWindowTypeToLayerLw(a.type);
mAttachedWindow = attachedWindow;
if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + this + " to " + mAttachedWindow);
mAttachedWindow.mChildWindows.add(this);
int children_size = mAttachedWindow.mChildWindows.size();
if (children_size == 0) {
mAttachedWindow.mChildWindows.add(this);
} else {
for (int i = 0; i < children_size; i++) {
WindowState child = (WindowState)mAttachedWindow.mChildWindows.get(i);
if (this.mSubLayer < child.mSubLayer) {
mAttachedWindow.mChildWindows.add(i, this);
break;
} else if (this.mSubLayer > child.mSubLayer) {
continue;
}
if (this.mBaseLayer <= child.mBaseLayer) {
mAttachedWindow.mChildWindows.add(i, this);
break;
} else {
continue;
}
}
if (children_size == mAttachedWindow.mChildWindows.size()) {
mAttachedWindow.mChildWindows.add(this);
}
}
mLayoutAttached = mAttrs.type !=
WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
mIsImWindow = attachedWindow.mAttrs.type == TYPE_INPUT_METHOD