Skip to content

Commit 7b1aa77

Browse files
author
Craig Mautner
committed
Include child windows when looking for insertion point.
After finding a window in the window list we turn around and look in the AppWindowToken.windows list for it. If it is a child of a window in that list we should use the parent windows index as the search result. Instead we gave up and ended up inserting the window at the beginning of the windows list. Bug 7357465 fixed. Change-Id: If77f343b8597bfbb0b7fa41dedf7972d78d03020
1 parent b1a01ab commit 7b1aa77

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)