Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b1aa77a authored by Craig Mautner's avatar Craig Mautner
Browse files

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
parent b1a01ab0
Loading
Loading
Loading
Loading
+25 −3
Original line number Diff line number Diff line
@@ -919,6 +919,27 @@ public class WindowManagerService extends IWindowManager.Stub
        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) {
        final IWindow client = win.mClient;
        final WindowToken token = win.mToken;
@@ -942,13 +963,13 @@ public class WindowManagerService extends IWindowManager.Stub
                        // Base windows go behind everything else.
                        WindowState lowestWindow = tokenWindowList.get(0);
                        placeWindowBefore(lowestWindow, win);
                        tokenWindowsPos = token.windows.indexOf(lowestWindow);
                        tokenWindowsPos = indexOfWinInWindowList(lowestWindow, token.windows);
                    } else {
                        AppWindowToken atoken = win.mAppToken;
                        WindowState lastWindow = tokenWindowList.get(index);
                        if (atoken != null && lastWindow == atoken.startingWindow) {
                            placeWindowBefore(lastWindow, win);
                            tokenWindowsPos = token.windows.indexOf(lastWindow);
                            tokenWindowsPos = indexOfWinInWindowList(lastWindow, token.windows);
                        } else {
                            int newIdx = findIdxBasedOnAppTokens(win);
                            //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.
                                tokenWindowsPos = 0;
                            } else {
                                tokenWindowsPos = token.windows.indexOf(windows.get(newIdx)) + 1;
                                tokenWindowsPos = indexOfWinInWindowList(
                                        windows.get(newIdx), token.windows) + 1;
                            }
                            mWindowsChanged = true;
                        }
+1 −1
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
    final WindowManager.LayoutParams mAttrs = new WindowManager.LayoutParams();
    final DeathRecipient mDeathRecipient;
    final WindowState mAttachedWindow;
    final ArrayList<WindowState> mChildWindows = new ArrayList<WindowState>();
    final WindowList mChildWindows = new WindowList();
    final int mBaseLayer;
    final int mSubLayer;
    final boolean mLayoutAttached;
+1 −1
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ class WindowToken {
    AppWindowToken appWindowToken;

    // 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?
    boolean paused = false;