@@ -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 }
0 commit comments