Switched RootWindowContainer to use WindowContainer.
This completes the first pass of defining a hierarchy in
window manager :)
WindowManagerService is now less than 10,000 line \o/
Bug: 30060889
Test: Manual testing and existing tests still pass.
Change-Id: Ib349220e9355d1894bd62294e7696827f033887f
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index d119fb7a..8de267c 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -96,14 +96,11 @@
/** Root {@link WindowContainer} for the device. */
// TODO: Several methods in here are accessing children of this container's children through various
// references (WindowList I am looking at you :/). See if we can delegate instead.
-class RootWindowContainer {
+class RootWindowContainer extends WindowContainer<DisplayContent> {
private static final String TAG = TAG_WITH_CLASS_NAME ? "RootWindowContainer" : TAG_WM;
WindowManagerService mService;
- /** All DisplayContents in the world, kept here */
- SparseArray<DisplayContent> mDisplayContents = new SparseArray<>(2);
-
private boolean mWallpaperForceHidingChanged = false;
private Object mLastWindowFreezeSource = null;
private Session mHoldScreen = null;
@@ -148,9 +145,9 @@
}
WindowState computeFocusedWindow() {
- final int count = mDisplayContents.size();
+ final int count = mChildren.size();
for (int i = 0; i < count; i++) {
- final DisplayContent dc = mDisplayContents.valueAt(i);
+ final DisplayContent dc = mChildren.get(i);
final WindowState win = dc.findFocusedWindow();
if (win != null) {
return win;
@@ -166,8 +163,9 @@
* @param displayId The display the caller is interested in.
* @return The DisplayContent associated with displayId or null if there is no Display for it.
*/
- DisplayContent getDisplayContent(final int displayId) {
- DisplayContent dc = mDisplayContents.get(displayId);
+ DisplayContent getDisplayContentOrCreate(int displayId) {
+ DisplayContent dc = getDisplayContent(displayId);
+
if (dc == null) {
final Display display = mService.mDisplayManager.getDisplay(displayId);
if (display != null) {
@@ -177,13 +175,24 @@
return dc;
}
- private DisplayContent createDisplayContent(final Display display) {
- DisplayContent displayContent = new DisplayContent(display, mService);
- final int displayId = display.getDisplayId();
- if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Adding display=" + display);
- mDisplayContents.put(displayId, displayContent);
+ private DisplayContent getDisplayContent(int displayId) {
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ final DisplayContent current = mChildren.get(i);
+ if (current.getDisplayId() == displayId) {
+ return current;
+ }
+ }
+ return null;
+ }
- final DisplayInfo displayInfo = displayContent.getDisplayInfo();
+ private DisplayContent createDisplayContent(final Display display) {
+ final DisplayContent dc = new DisplayContent(display, mService);
+ final int displayId = display.getDisplayId();
+
+ if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Adding display=" + display);
+ addChild(dc, null);
+
+ final DisplayInfo displayInfo = dc.getDisplayInfo();
final Rect rect = new Rect();
mService.mDisplaySettings.getOverscanLocked(displayInfo.name, displayInfo.uniqueId, rect);
displayInfo.overscanLeft = rect.left;
@@ -193,23 +202,23 @@
if (mService.mDisplayManagerInternal != null) {
mService.mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(
displayId, displayInfo);
- mService.configureDisplayPolicyLocked(displayContent);
+ mService.configureDisplayPolicyLocked(dc);
// TODO(multi-display): Create an input channel for each display with touch capability.
if (displayId == Display.DEFAULT_DISPLAY) {
- displayContent.mTapDetector = new TaskTapPointerEventListener(
- mService, displayContent);
- mService.registerPointerEventListener(displayContent.mTapDetector);
+ dc.mTapDetector = new TaskTapPointerEventListener(
+ mService, dc);
+ mService.registerPointerEventListener(dc.mTapDetector);
mService.registerPointerEventListener(mService.mMousePositionTracker);
}
}
- return displayContent;
+ return dc;
}
/** Adds the input stack id to the input display id and returns the bounds of the added stack.*/
Rect addStackToDisplay(int stackId, int displayId, boolean onTop) {
- final DisplayContent dc = mDisplayContents.get(displayId);
+ final DisplayContent dc = getDisplayContent(displayId);
if (dc == null) {
Slog.w(TAG_WM, "addStackToDisplay: Trying to add stackId=" + stackId
+ " to unknown displayId=" + displayId + " callers=" + Debug.getCallers(6));
@@ -249,9 +258,9 @@
}
boolean layoutNeeded() {
- final int numDisplays = mDisplayContents.size();
+ final int numDisplays = mChildren.size();
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
+ final DisplayContent displayContent = mChildren.get(displayNdx);
if (displayContent.layoutNeeded) {
return true;
}
@@ -260,17 +269,17 @@
}
void getWindows(WindowList output) {
- final int count = mDisplayContents.size();
+ final int count = mChildren.size();
for (int i = 0; i < count; ++i) {
- final DisplayContent dc = mDisplayContents.valueAt(i);
+ final DisplayContent dc = mChildren.get(i);
output.addAll(dc.getWindowList());
}
}
void getWindows(WindowList output, boolean visibleOnly, boolean appsOnly) {
- final int numDisplays = mDisplayContents.size();
+ final int numDisplays = mChildren.size();
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final WindowList windowList = mDisplayContents.valueAt(displayNdx).getWindowList();
+ final WindowList windowList = mChildren.get(displayNdx).getWindowList();
for (int winNdx = windowList.size() - 1; winNdx >= 0; --winNdx) {
final WindowState w = windowList.get(winNdx);
if ((!visibleOnly || w.mWinAnimator.getShown())
@@ -289,9 +298,9 @@
name = null;
} catch (RuntimeException e) {
}
- final int numDisplays = mDisplayContents.size();
+ final int numDisplays = mChildren.size();
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final WindowList windowList = mDisplayContents.valueAt(displayNdx).getWindowList();
+ final WindowList windowList = mChildren.get(displayNdx).getWindowList();
for (int winNdx = windowList.size() - 1; winNdx >= 0; --winNdx) {
final WindowState w = windowList.get(winNdx);
if (name != null) {
@@ -306,9 +315,9 @@
}
WindowState findWindow(int hashCode) {
- final int numDisplays = mDisplayContents.size();
+ final int numDisplays = mChildren.size();
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList();
+ final WindowList windows = mChildren.get(displayNdx).getWindowList();
final int numWindows = windows.size();
for (int winNdx = 0; winNdx < numWindows; ++winNdx) {
final WindowState w = windows.get(winNdx);
@@ -323,9 +332,9 @@
// TODO: Users would have their own window containers under the display container?
void switchUser() {
- final int count = mDisplayContents.size();
+ final int count = mChildren.size();
for (int i = 0; i < count; ++i) {
- final DisplayContent dc = mDisplayContents.valueAt(i);
+ final DisplayContent dc = mChildren.get(i);
dc.switchUser();
}
}
@@ -338,24 +347,24 @@
mChangedStackList.clear();
- final int numDisplays = mDisplayContents.size();
- for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
- displayContent.onConfigurationChanged(mChangedStackList);
+ final int numDisplays = mChildren.size();
+ for (int i = 0; i < numDisplays; ++i) {
+ final DisplayContent dc = mChildren.get(i);
+ dc.onConfigurationChanged(mChangedStackList);
}
return mChangedStackList.isEmpty() ? null : ArrayUtils.convertToIntArray(mChangedStackList);
}
private void prepareFreezingTaskBounds() {
- for (int i = mDisplayContents.size() - 1; i >= 0; i--) {
- mDisplayContents.valueAt(i).prepareFreezingTaskBounds();
+ for (int i = mChildren.size() - 1; i >= 0; i--) {
+ mChildren.get(i).prepareFreezingTaskBounds();
}
}
void setSecureSurfaceState(int userId, boolean disabled) {
- for (int i = mDisplayContents.size() - 1; i >= 0; --i) {
- final WindowList windows = mDisplayContents.valueAt(i).getWindowList();
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ final WindowList windows = mChildren.get(i).getWindowList();
for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
final WindowState win = windows.get(winNdx);
if (win.mHasSurface && userId == UserHandle.getUserId(win.mOwnerUid)) {
@@ -366,9 +375,9 @@
}
void updateAppOpsState() {
- final int count = mDisplayContents.size();
+ final int count = mChildren.size();
for (int i = 0; i < count; ++i) {
- final WindowList windows = mDisplayContents.valueAt(i).getWindowList();
+ final WindowList windows = mChildren.get(i).getWindowList();
final int numWindows = windows.size();
for (int winNdx = 0; winNdx < numWindows; ++winNdx) {
final WindowState win = windows.get(winNdx);
@@ -384,9 +393,9 @@
}
boolean canShowStrictModeViolation(int pid) {
- final int count = mDisplayContents.size();
+ final int count = mChildren.size();
for (int i = 0; i < count; ++i) {
- final WindowList windows = mDisplayContents.valueAt(i).getWindowList();
+ final WindowList windows = mChildren.get(i).getWindowList();
final int numWindows = windows.size();
for (int winNdx = 0; winNdx < numWindows; ++winNdx) {
final WindowState ws = windows.get(winNdx);
@@ -399,9 +408,9 @@
}
void closeSystemDialogs(String reason) {
- final int count = mDisplayContents.size();
+ final int count = mChildren.size();
for (int i = 0; i < count; ++i) {
- final WindowList windows = mDisplayContents.valueAt(i).getWindowList();
+ final WindowList windows = mChildren.get(i).getWindowList();
final int numWindows = windows.size();
for (int j = 0; j < numWindows; ++j) {
final WindowState w = windows.get(j);
@@ -419,8 +428,8 @@
if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION removeReplacedWindows");
mService.openSurfaceTransaction();
try {
- for (int i = mDisplayContents.size() - 1; i >= 0; i--) {
- DisplayContent dc = mDisplayContents.valueAt(i);
+ for (int i = mChildren.size() - 1; i >= 0; i--) {
+ DisplayContent dc = mChildren.get(i);
final WindowList windows = dc.getWindowList();
for (int j = windows.size() - 1; j >= 0; j--) {
final WindowState win = windows.get(j);
@@ -439,9 +448,9 @@
boolean hasPendingLayoutChanges(WindowAnimator animator) {
boolean hasChanges = false;
- final int count = mDisplayContents.size();
+ final int count = mChildren.size();
for (int i = 0; i < count; ++i) {
- final DisplayContent dc = mDisplayContents.valueAt(i);
+ final DisplayContent dc = mChildren.get(i);
final int pendingChanges = animator.getPendingLayoutChanges(dc.getDisplayId());
if ((pendingChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
animator.mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING;
@@ -460,9 +469,9 @@
final WallpaperController wallpaperController = mService.mWallpaperControllerLocked;
boolean disableWallpaperTouchEvents = false;
- final int count = mDisplayContents.size();
+ final int count = mChildren.size();
for (int i = 0; i < count; ++i) {
- final DisplayContent dc = mDisplayContents.valueAt(i);
+ final DisplayContent dc = mChildren.get(i);
final WindowList windows = dc.getWindowList();
for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
final WindowState child = windows.get(winNdx);
@@ -537,9 +546,9 @@
// we haven't left any dangling surfaces around.
Slog.i(TAG_WM, "Out of memory for surface! Looking for leaks...");
- final int numDisplays = mDisplayContents.size();
+ final int numDisplays = mChildren.size();
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList();
+ final WindowList windows = mChildren.get(displayNdx).getWindowList();
final int numWindows = windows.size();
for (int winNdx = 0; winNdx < numWindows; ++winNdx) {
final WindowState ws = windows.get(winNdx);
@@ -572,7 +581,7 @@
Slog.w(TAG_WM, "No leaked surfaces; killing applications!");
SparseIntArray pidCandidates = new SparseIntArray();
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList();
+ final WindowList windows = mChildren.get(displayNdx).getWindowList();
final int numWindows = windows.size();
for (int winNdx = 0; winNdx < numWindows; ++winNdx) {
final WindowState ws = windows.get(winNdx);
@@ -639,9 +648,9 @@
}
// Initialize state of exiting tokens.
- final int numDisplays = mDisplayContents.size();
+ final int numDisplays = mChildren.size();
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
+ final DisplayContent displayContent = mChildren.get(displayNdx);
for (i = displayContent.mExitingTokens.size() - 1; i >= 0; i--) {
displayContent.mExitingTokens.get(i).hasVisible = false;
}
@@ -788,7 +797,7 @@
// Time to remove any exiting tokens?
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
+ final DisplayContent displayContent = mChildren.get(displayNdx);
ArrayList<WindowToken> exitingTokens = displayContent.mExitingTokens;
for (i = exitingTokens.size() - 1; i >= 0; i--) {
WindowToken token = exitingTokens.get(i);
@@ -827,7 +836,7 @@
}
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
+ final DisplayContent displayContent = mChildren.get(displayNdx);
if (displayContent.pendingLayoutChanges != 0) {
displayContent.layoutNeeded = true;
}
@@ -913,8 +922,8 @@
}
// Remove all deferred displays stacks, tasks, and activities.
- for (int displayNdx = mDisplayContents.size() - 1; displayNdx >= 0; --displayNdx) {
- mDisplayContents.valueAt(displayNdx).checkCompleteDeferredRemoval();
+ for (int displayNdx = mChildren.size() - 1; displayNdx >= 0; --displayNdx) {
+ mChildren.get(displayNdx).checkCompleteDeferredRemoval();
}
if (updateInputWindowsNeeded) {
@@ -954,9 +963,9 @@
boolean focusDisplayed = false;
- final int count = mDisplayContents.size();
+ final int count = mChildren.size();
for (int j = 0; j < count; ++j) {
- final DisplayContent dc = mDisplayContents.valueAt(j);
+ final DisplayContent dc = mChildren.get(j);
boolean updateAllDrawn = false;
WindowList windows = dc.getWindowList();
DisplayInfo displayInfo = dc.getDisplayInfo();
@@ -1359,8 +1368,8 @@
mSurfaceTraceEnabled = true;
mRemoteEventTrace = new RemoteEventTrace(mService, fd);
mSurfaceTraceFd = pfd;
- for (int displayNdx = mDisplayContents.size() - 1; displayNdx >= 0; --displayNdx) {
- DisplayContent dc = mDisplayContents.valueAt(displayNdx);
+ for (int displayNdx = mChildren.size() - 1; displayNdx >= 0; --displayNdx) {
+ final DisplayContent dc = mChildren.get(displayNdx);
dc.enableSurfaceTrace(fd);
}
}
@@ -1369,8 +1378,8 @@
mSurfaceTraceEnabled = false;
mRemoteEventTrace = null;
mSurfaceTraceFd = null;
- for (int displayNdx = mDisplayContents.size() - 1; displayNdx >= 0; --displayNdx) {
- DisplayContent dc = mDisplayContents.valueAt(displayNdx);
+ for (int displayNdx = mChildren.size() - 1; displayNdx >= 0; --displayNdx) {
+ final DisplayContent dc = mChildren.get(displayNdx);
dc.disableSurfaceTrace();
}
}
@@ -1378,9 +1387,9 @@
void dumpDisplayContents(PrintWriter pw) {
pw.println("WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)");
if (mService.mDisplayReady) {
- final int count = mDisplayContents.size();
+ final int count = mChildren.size();
for (int i = 0; i < count; ++i) {
- final DisplayContent displayContent = mDisplayContents.valueAt(i);
+ final DisplayContent displayContent = mChildren.get(i);
displayContent.dump(" ", pw);
}
} else {
@@ -1393,9 +1402,9 @@
return;
}
pw.print(" layoutNeeded on displays=");
- final int count = mDisplayContents.size();
+ final int count = mChildren.size();
for (int displayNdx = 0; displayNdx < count; ++displayNdx) {
- final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
+ final DisplayContent displayContent = mChildren.get(displayNdx);
if (displayContent.layoutNeeded) {
pw.print(displayContent.getDisplayId());
}
@@ -1404,9 +1413,9 @@
}
void dumpWindowsNoHeader(PrintWriter pw, boolean dumpAll, ArrayList<WindowState> windows) {
- final int numDisplays = mDisplayContents.size();
+ final int numDisplays = mChildren.size();
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final WindowList windowList = mDisplayContents.valueAt(displayNdx).getWindowList();
+ final WindowList windowList = mChildren.get(displayNdx).getWindowList();
for (int winNdx = windowList.size() - 1; winNdx >= 0; --winNdx) {
final WindowState w = windowList.get(winNdx);
if (windows == null || windows.contains(w)) {