summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java17
-rw-r--r--services/core/java/com/android/server/display/DisplayDevice.java3
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java4
-rw-r--r--services/core/java/com/android/server/display/LocalDisplayAdapter.java5
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java2
5 files changed, 25 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index dfe89e00b20b..9b1451e8e5d1 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.database.ContentObserver;
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.Map;
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 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
}
- 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 839ab4d4867d..3a8e291f7976 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 @@ abstract class DisplayDevice {
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 a55fec5246d3..2a41184f7c91 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 @@ public final class DisplayManagerService extends SystemService {
@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 23e4c9bf69cd..fc3c1f74ce4f 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 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
}
+ @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 58673dbe3cd8..f0d2cf56bc3d 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 class WindowManagerService extends IWindowManager.Stub
public void onOverlayChanged() {
synchronized (mWindowMap) {
mPolicy.onOverlayChangedLw();
- mDisplayManagerInternal.onOverlayChanged();
+ getDefaultDisplayContentLocked().updateDisplayInfo();
requestTraversal();
}
}