Merge "Switched RootWindowContainer to use WindowContainer."
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 2ae4b2a..1a397ff 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -1055,7 +1055,7 @@
 
     @Override
     void updateAllDrawn(int displayId) {
-        final DisplayContent displayContent = mService.mRoot.getDisplayContent(displayId);
+        final DisplayContent displayContent = mService.mRoot.getDisplayContentOrCreate(displayId);
 
         if (!allDrawn) {
             final int numInteresting = numInterestingWindows;
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 54e3058..0ff30e2 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -485,8 +485,6 @@
     void removeImmediately() {
         super.removeImmediately();
         if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Removing display=" + this);
-        // TODO: remove this line once RootWindowContainer is online.
-        mService.mRoot.mDisplayContents.delete(mDisplayId);
         mDimLayerController.close();
         if (mDisplayId == Display.DEFAULT_DISPLAY) {
             mService.unregisterPointerEventListener(mTapDetector);
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)) {
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index 28b5424..fb6b09a 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -40,7 +40,6 @@
 import static com.android.server.wm.WindowSurfacePlacer.SET_FORCE_HIDING_CHANGED;
 import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE;
 import static com.android.server.wm.WindowSurfacePlacer.SET_UPDATE_ROTATION;
-import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_ACTION_PENDING;
 import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_MAY_CHANGE;
 
 import android.content.Context;
@@ -528,7 +527,7 @@
     }
 
     private void updateWallpaperLocked(int displayId) {
-        mService.mRoot.getDisplayContent(displayId).resetAnimationBackgroundAnimator();
+        mService.mRoot.getDisplayContentOrCreate(displayId).resetAnimationBackgroundAnimator();
 
         final WindowList windows = mService.getWindowListLocked(displayId);
         WindowState detachedWallpaper = null;
@@ -615,7 +614,8 @@
             final int numDisplays = mDisplayContentsAnimators.size();
             for (int i = 0; i < numDisplays; i++) {
                 final int displayId = mDisplayContentsAnimators.keyAt(i);
-                final DisplayContent displayContent = mService.mRoot.getDisplayContent(displayId);
+                final DisplayContent displayContent = mService.mRoot.getDisplayContentOrCreate(
+                        displayId);
                 displayContent.stepAppWindowsAnimation(mCurrentTime);
                 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
 
@@ -654,7 +654,8 @@
 
             for (int i = 0; i < numDisplays; i++) {
                 final int displayId = mDisplayContentsAnimators.keyAt(i);
-                final DisplayContent displayContent = mService.mRoot.getDisplayContent(displayId);
+                final DisplayContent displayContent = mService.mRoot.getDisplayContentOrCreate(
+                        displayId);
 
                 displayContent.checkAppWindowsReadyToShow();
 
@@ -799,7 +800,7 @@
         if (displayId < 0) {
             return 0;
         }
-        final DisplayContent displayContent = mService.mRoot.getDisplayContent(displayId);
+        final DisplayContent displayContent = mService.mRoot.getDisplayContentOrCreate(displayId);
         return (displayContent != null) ? displayContent.pendingLayoutChanges : 0;
     }
 
@@ -807,7 +808,7 @@
         if (displayId < 0) {
             return;
         }
-        final DisplayContent displayContent = mService.mRoot.getDisplayContent(displayId);
+        final DisplayContent displayContent = mService.mRoot.getDisplayContentOrCreate(displayId);
         if (displayContent != null) {
             displayContent.pendingLayoutChanges |= changes;
         }
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 6e92c31..cd87fbd 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -1495,7 +1495,7 @@
                 throw new IllegalStateException("Display has not been initialialized");
             }
 
-            final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+            final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
             if (displayContent == null) {
                 Slog.w(TAG_WM, "Attempted to add window to a display that does not exist: "
                         + displayId + ".  Aborting.");
@@ -5103,7 +5103,7 @@
             boolean wallpaperOnly) {
         final DisplayContent displayContent;
         synchronized(mWindowMap) {
-            displayContent = mRoot.getDisplayContent(displayId);
+            displayContent = mRoot.getDisplayContentOrCreate(displayId);
             if (displayContent == null) {
                 if (DEBUG_SCREENSHOT) Slog.i(TAG_WM, "Screenshot of " + appToken
                         + ": returning null. No Display for displayId=" + displayId);
@@ -6795,7 +6795,7 @@
 
     private void displayReady(int displayId) {
         synchronized(mWindowMap) {
-            final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+            final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
             if (displayContent != null) {
                 mAnimator.addDisplayLocked(displayId);
                 displayContent.initializeDisplayBaseInfo();
@@ -7636,7 +7636,7 @@
     @Override
     public void getInitialDisplaySize(int displayId, Point size) {
         synchronized (mWindowMap) {
-            final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+            final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
             if (displayContent != null && displayContent.hasAccess(Binder.getCallingUid())) {
                 size.x = displayContent.mInitialDisplayWidth;
                 size.y = displayContent.mInitialDisplayHeight;
@@ -7647,7 +7647,7 @@
     @Override
     public void getBaseDisplaySize(int displayId, Point size) {
         synchronized (mWindowMap) {
-            final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+            final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
             if (displayContent != null && displayContent.hasAccess(Binder.getCallingUid())) {
                 size.x = displayContent.mBaseDisplayWidth;
                 size.y = displayContent.mBaseDisplayHeight;
@@ -7674,7 +7674,7 @@
                 final int MIN_WIDTH = 200;
                 final int MIN_HEIGHT = 200;
                 final int MAX_SCALE = 2;
-                final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+                final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
                 if (displayContent != null) {
                     width = Math.min(Math.max(width, MIN_WIDTH),
                             displayContent.mInitialDisplayWidth * MAX_SCALE);
@@ -7704,7 +7704,7 @@
         final long ident = Binder.clearCallingIdentity();
         try {
             synchronized(mWindowMap) {
-                final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+                final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
                 if (displayContent != null) {
                     if (mode < 0 || mode > 1) {
                         mode = 0;
@@ -7787,7 +7787,7 @@
         final long ident = Binder.clearCallingIdentity();
         try {
             synchronized(mWindowMap) {
-                final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+                final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
                 if (displayContent != null) {
                     setForcedDisplaySizeLocked(displayContent, displayContent.mInitialDisplayWidth,
                             displayContent.mInitialDisplayHeight);
@@ -7803,7 +7803,7 @@
     @Override
     public int getInitialDisplayDensity(int displayId) {
         synchronized (mWindowMap) {
-            final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+            final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
             if (displayContent != null && displayContent.hasAccess(Binder.getCallingUid())) {
                 return displayContent.mInitialDisplayDensity;
             }
@@ -7814,7 +7814,7 @@
     @Override
     public int getBaseDisplayDensity(int displayId) {
         synchronized (mWindowMap) {
-            final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+            final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
             if (displayContent != null && displayContent.hasAccess(Binder.getCallingUid())) {
                 return displayContent.mBaseDisplayDensity;
             }
@@ -7840,7 +7840,7 @@
         final long ident = Binder.clearCallingIdentity();
         try {
             synchronized(mWindowMap) {
-                final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+                final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
                 if (displayContent != null && mCurrentUserId == targetUserId) {
                     setForcedDisplayDensityLocked(displayContent, density);
                 }
@@ -7871,7 +7871,7 @@
         final long ident = Binder.clearCallingIdentity();
         try {
             synchronized(mWindowMap) {
-                final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+                final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
                 if (displayContent != null && mCurrentUserId == callingUserId) {
                     setForcedDisplayDensityLocked(displayContent,
                             displayContent.mInitialDisplayDensity);
@@ -7960,7 +7960,7 @@
         final long ident = Binder.clearCallingIdentity();
         try {
             synchronized(mWindowMap) {
-                DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+                DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
                 if (displayContent != null) {
                     setOverscanLocked(displayContent, left, top, right, bottom);
                 }
@@ -9270,12 +9270,12 @@
         if (display == null) {
             throw new IllegalArgumentException("getDisplayContent: display must not be null");
         }
-        mRoot.getDisplayContent(display.getDisplayId());
+        mRoot.getDisplayContentOrCreate(display.getDisplayId());
     }
 
     // There is an inherent assumption that this will never return null.
     public DisplayContent getDefaultDisplayContentLocked() {
-        return mRoot.getDisplayContent(Display.DEFAULT_DISPLAY);
+        return mRoot.getDisplayContentOrCreate(Display.DEFAULT_DISPLAY);
     }
 
     public WindowList getDefaultWindowListLocked() {
@@ -9292,7 +9292,7 @@
      * @return The list of WindowStates on the screen, or null if the there is no screen.
      */
     WindowList getWindowListLocked(final int displayId) {
-        final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+        final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
         return displayContent != null ? displayContent.getWindowList() : null;
     }
 
@@ -9316,7 +9316,7 @@
     }
 
     private void handleDisplayRemovedLocked(int displayId) {
-        final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+        final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
         if (displayContent != null) {
             displayContent.removeIfPossible();
         }
@@ -9329,7 +9329,7 @@
     }
 
     private void handleDisplayChangedLocked(int displayId) {
-        final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+        final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);
         if (displayContent != null) {
             displayContent.updateDisplayInfo();
         }