diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 4573ede13f7f5..c6bfe8ba253cd 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -1814,10 +1814,14 @@ public class DisplayPolicy { /** * Called when the resource overlays change. */ - public void onOverlayChangedLw() { + void onOverlayChanged() { updateCurrentUserResources(); + // Update the latest display size, cutout. + mDisplayContent.updateDisplayInfo(); + // The height of status bar needs to update in case display cutout is changed. onConfigurationChanged(); - mSystemGestures.onConfigurationChanged(); + // The height of status bar can affect screen size configuration. + mDisplayContent.reconfigureDisplayLocked(); } /** diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 451e777387450..d7498b757124a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -6967,13 +6967,17 @@ public class WindowManagerService extends IWindowManager.Stub } public void onOverlayChanged() { - synchronized (mGlobalLock) { - mRoot.forAllDisplays(displayContent -> { - displayContent.getDisplayPolicy().onOverlayChangedLw(); - displayContent.updateDisplayInfo(); - }); - requestTraversal(); - } + // Post to display thread so it can get the latest display info. + mH.post(() -> { + synchronized (mGlobalLock) { + mAtmService.deferWindowLayout(); + try { + mRoot.forAllDisplays(dc -> dc.getDisplayPolicy().onOverlayChanged()); + } finally { + mAtmService.continueWindowLayout(); + } + } + }); } @Override