DisplayCutout: Actually reload displays when resource overlays change
This allows the DisplayManager to pick up changes to the
DisplayCutout resource, which is used to implement emulation
of the overlay.
Bug: 65689439
Test: adb shell overlay enable ...; verify cutout is picked up immediately and not only after toggling the display
Change-Id: I22c32802859d7c8cc373cbb8f17e41cdaf84c844
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index dfe89e0..9b1451e 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -293,6 +293,7 @@
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.Rect;
+import android.hardware.display.DisplayManagerInternal;
import android.location.LocationManager;
import android.media.audiofx.AudioEffect;
import android.metrics.LogMaker;
@@ -472,6 +473,7 @@
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
@@ -25343,9 +25345,18 @@
}
}
}
- if (updateFrameworkRes && mWindowManager != null) {
- ActivityThread.currentActivityThread().getExecutor().execute(
- mWindowManager::onOverlayChanged);
+ if (updateFrameworkRes) {
+ // Update system server components that need to know about changed overlays. Because the
+ // overlay is applied in ActivityThread, we need to serialize through its thread too.
+ final Executor executor = ActivityThread.currentActivityThread().getExecutor();
+ final DisplayManagerInternal display =
+ LocalServices.getService(DisplayManagerInternal.class);
+ if (display != null) {
+ executor.execute(display::onOverlayChanged);
+ }
+ if (mWindowManager != null) {
+ executor.execute(mWindowManager::onOverlayChanged);
+ }
}
}
diff --git a/services/core/java/com/android/server/display/DisplayDevice.java b/services/core/java/com/android/server/display/DisplayDevice.java
index 839ab4d..3a8e291 100644
--- a/services/core/java/com/android/server/display/DisplayDevice.java
+++ b/services/core/java/com/android/server/display/DisplayDevice.java
@@ -143,6 +143,9 @@
public void requestDisplayModesInTransactionLocked(int colorMode, int modeId) {
}
+ public void onOverlayChangedLocked() {
+ }
+
/**
* Sets the display layer stack while in a transaction.
*/
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index a55fec5..2a41184 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -2013,8 +2013,8 @@
@Override
public void onOverlayChanged() {
synchronized (mSyncRoot) {
- if (updateLogicalDisplaysLocked()) {
- scheduleTraversalLocked(false);
+ for (int i = 0; i < mDisplayDevices.size(); i++) {
+ mDisplayDevices.get(i).onOverlayChangedLocked();
}
}
}
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 23e4c9b..fc3c1f7 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -600,6 +600,11 @@
}
}
+ @Override
+ public void onOverlayChangedLocked() {
+ updateDeviceInfoLocked();
+ }
+
public boolean requestModeInTransactionLocked(int modeId) {
if (modeId == 0) {
modeId = mDefaultModeId;
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 58673db..f0d2cf5 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -6600,7 +6600,7 @@
public void onOverlayChanged() {
synchronized (mWindowMap) {
mPolicy.onOverlayChangedLw();
- mDisplayManagerInternal.onOverlayChanged();
+ getDefaultDisplayContentLocked().updateDisplayInfo();
requestTraversal();
}
}