diff options
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(); } } |