am 46732445: Merge "Include child windows when looking for insertion point." into jb-mr1.1-dev

* commit '46732445b4c02c225544851cb6cf848ec0583494':
  Include child windows when looking for insertion point.
This commit is contained in:
Craig Mautner
2012-11-30 16:42:56 -08:00
committed by Android Git Automerger
3 changed files with 27 additions and 5 deletions

View File

@ -919,6 +919,27 @@ public class WindowManagerService extends IWindowManager.Stub
return windowList; return windowList;
} }
/**
* Recursive search through a WindowList and all of its windows' children.
* @param targetWin The window to search for.
* @param windows The list to search.
* @return The index of win in windows or of the window that is an ancestor of win.
*/
private int indexOfWinInWindowList(WindowState targetWin, WindowList windows) {
for (int i = windows.size() - 1; i >= 0; i--) {
final WindowState w = windows.get(i);
if (w == targetWin) {
return i;
}
if (!w.mChildWindows.isEmpty()) {
if (indexOfWinInWindowList(targetWin, w.mChildWindows) >= 0) {
return i;
}
}
}
return -1;
}
private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) { private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) {
final IWindow client = win.mClient; final IWindow client = win.mClient;
final WindowToken token = win.mToken; final WindowToken token = win.mToken;
@ -942,13 +963,13 @@ public class WindowManagerService extends IWindowManager.Stub
// Base windows go behind everything else. // Base windows go behind everything else.
WindowState lowestWindow = tokenWindowList.get(0); WindowState lowestWindow = tokenWindowList.get(0);
placeWindowBefore(lowestWindow, win); placeWindowBefore(lowestWindow, win);
tokenWindowsPos = token.windows.indexOf(lowestWindow); tokenWindowsPos = indexOfWinInWindowList(lowestWindow, token.windows);
} else { } else {
AppWindowToken atoken = win.mAppToken; AppWindowToken atoken = win.mAppToken;
WindowState lastWindow = tokenWindowList.get(index); WindowState lastWindow = tokenWindowList.get(index);
if (atoken != null && lastWindow == atoken.startingWindow) { if (atoken != null && lastWindow == atoken.startingWindow) {
placeWindowBefore(lastWindow, win); placeWindowBefore(lastWindow, win);
tokenWindowsPos = token.windows.indexOf(lastWindow); tokenWindowsPos = indexOfWinInWindowList(lastWindow, token.windows);
} else { } else {
int newIdx = findIdxBasedOnAppTokens(win); int newIdx = findIdxBasedOnAppTokens(win);
//there is a window above this one associated with the same //there is a window above this one associated with the same
@ -964,7 +985,8 @@ public class WindowManagerService extends IWindowManager.Stub
// No window from token found on win's display. // No window from token found on win's display.
tokenWindowsPos = 0; tokenWindowsPos = 0;
} else { } else {
tokenWindowsPos = token.windows.indexOf(windows.get(newIdx)) + 1; tokenWindowsPos = indexOfWinInWindowList(
windows.get(newIdx), token.windows) + 1;
} }
mWindowsChanged = true; mWindowsChanged = true;
} }

View File

@ -79,7 +79,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
final WindowManager.LayoutParams mAttrs = new WindowManager.LayoutParams(); final WindowManager.LayoutParams mAttrs = new WindowManager.LayoutParams();
final DeathRecipient mDeathRecipient; final DeathRecipient mDeathRecipient;
final WindowState mAttachedWindow; final WindowState mAttachedWindow;
final ArrayList<WindowState> mChildWindows = new ArrayList<WindowState>(); final WindowList mChildWindows = new WindowList();
final int mBaseLayer; final int mBaseLayer;
final int mSubLayer; final int mSubLayer;
final boolean mLayoutAttached; final boolean mLayoutAttached;

View File

@ -48,7 +48,7 @@ class WindowToken {
AppWindowToken appWindowToken; AppWindowToken appWindowToken;
// All of the windows associated with this token. // All of the windows associated with this token.
final ArrayList<WindowState> windows = new ArrayList<WindowState>(); final WindowList windows = new WindowList();
// Is key dispatching paused for this token? // Is key dispatching paused for this token?
boolean paused = false; boolean paused = false;