Skip to content

Commit 4673244

Browse files
Craig MautnerAndroid (Google) Code Review
authored andcommitted
Merge "Include child windows when looking for insertion point." into jb-mr1.1-dev
2 parents ce46384 + 7b1aa77 commit 4673244

File tree

3 files changed

+27
-5
lines changed

3 files changed

+27
-5
lines changed

services/java/com/android/server/wm/WindowManagerService.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,27 @@ WindowList getTokenWindowsOnDisplay(WindowToken token, DisplayContent displayCon
919919
return windowList;
920920
}
921921

922+
/**
923+
* Recursive search through a WindowList and all of its windows' children.
924+
* @param targetWin The window to search for.
925+
* @param windows The list to search.
926+
* @return The index of win in windows or of the window that is an ancestor of win.
927+
*/
928+
private int indexOfWinInWindowList(WindowState targetWin, WindowList windows) {
929+
for (int i = windows.size() - 1; i >= 0; i--) {
930+
final WindowState w = windows.get(i);
931+
if (w == targetWin) {
932+
return i;
933+
}
934+
if (!w.mChildWindows.isEmpty()) {
935+
if (indexOfWinInWindowList(targetWin, w.mChildWindows) >= 0) {
936+
return i;
937+
}
938+
}
939+
}
940+
return -1;
941+
}
942+
922943
private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) {
923944
final IWindow client = win.mClient;
924945
final WindowToken token = win.mToken;
@@ -942,13 +963,13 @@ private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) {
942963
// Base windows go behind everything else.
943964
WindowState lowestWindow = tokenWindowList.get(0);
944965
placeWindowBefore(lowestWindow, win);
945-
tokenWindowsPos = token.windows.indexOf(lowestWindow);
966+
tokenWindowsPos = indexOfWinInWindowList(lowestWindow, token.windows);
946967
} else {
947968
AppWindowToken atoken = win.mAppToken;
948969
WindowState lastWindow = tokenWindowList.get(index);
949970
if (atoken != null && lastWindow == atoken.startingWindow) {
950971
placeWindowBefore(lastWindow, win);
951-
tokenWindowsPos = token.windows.indexOf(lastWindow);
972+
tokenWindowsPos = indexOfWinInWindowList(lastWindow, token.windows);
952973
} else {
953974
int newIdx = findIdxBasedOnAppTokens(win);
954975
//there is a window above this one associated with the same
@@ -964,7 +985,8 @@ private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) {
964985
// No window from token found on win's display.
965986
tokenWindowsPos = 0;
966987
} else {
967-
tokenWindowsPos = token.windows.indexOf(windows.get(newIdx)) + 1;
988+
tokenWindowsPos = indexOfWinInWindowList(
989+
windows.get(newIdx), token.windows) + 1;
968990
}
969991
mWindowsChanged = true;
970992
}

services/java/com/android/server/wm/WindowState.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
7979
final WindowManager.LayoutParams mAttrs = new WindowManager.LayoutParams();
8080
final DeathRecipient mDeathRecipient;
8181
final WindowState mAttachedWindow;
82-
final ArrayList<WindowState> mChildWindows = new ArrayList<WindowState>();
82+
final WindowList mChildWindows = new WindowList();
8383
final int mBaseLayer;
8484
final int mSubLayer;
8585
final boolean mLayoutAttached;

services/java/com/android/server/wm/WindowToken.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class WindowToken {
4848
AppWindowToken appWindowToken;
4949

5050
// All of the windows associated with this token.
51-
final ArrayList<WindowState> windows = new ArrayList<WindowState>();
51+
final WindowList windows = new WindowList();
5252

5353
// Is key dispatching paused for this token?
5454
boolean paused = false;

0 commit comments

Comments
 (0)