From eb8882f09b4f38d691ae87a4f04f628c52f30436 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Tue, 2 Aug 2022 17:38:00 +0800 Subject: [PATCH] Get the latest display info for overlay change LocalDisplayAdapter.LocalDisplayDevice#updateDeviceInfoLocked posts to display thread when receiving onOverlayChanged. So the operation depends on it should run sequentially. This partial relands commit 08a3049 to make sure that the display info can include the latest cutout info after changing the cutout overlay resources. The reconfigureDisplayLocked in previous commit is not called in this change because that will require to fix configuration calculation according to decor windows that provide display config related insets. Bug: 222572231 Bug: 240961743 Test: Toggle different types of cutout in developer options, the cutout change should be applied immediately on screen. Change-Id: I393c7b2c2e95eabc21123b7c95c760323a5386ec --- .../java/com/android/server/wm/DisplayPolicy.java | 4 +++- .../android/server/wm/WindowManagerService.java | 15 ++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 14e2241112861..565d5cc88f4be 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -1882,8 +1882,10 @@ public class DisplayPolicy { /** * Called when the resource overlays change. */ - public void onOverlayChangedLw() { + void onOverlayChanged() { updateCurrentUserResources(); + // Update the latest display size, cutout. + mDisplayContent.updateDisplayInfo(); onConfigurationChanged(); mSystemGestures.onConfigurationChanged(); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 08c473226837f..296390a57bcc1 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -7046,13 +7046,14 @@ 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(); + mRoot.forAllDisplays(dc -> dc.getDisplayPolicy().onOverlayChanged()); + mAtmService.continueWindowLayout(); + } + }); } @Override