diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index c65ca08475639..84228cf47c9cb 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2001,6 +2001,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } void configureDisplayPolicy() { + mRootWindowContainer.updateDisplayImePolicyCache(); mDisplayPolicy.updateConfigurationAndScreenSizeDependentBehaviors(); mDisplayRotation.configure(mBaseDisplayWidth, mBaseDisplayHeight); } @@ -3939,6 +3940,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } } + // IMPORTANT: When introducing new dependencies in this method, make sure that + // changes to those result in RootWindowContainer.updateDisplayImePolicyCache() + // being called. @DisplayImePolicy int getImePolicy() { if (!isTrusted()) { return DISPLAY_IME_POLICY_FALLBACK_DISPLAY; diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 5a420caa176ca..01bc67f18c723 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -165,6 +165,7 @@ import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Set; @@ -2530,9 +2531,16 @@ class RootWindowContainer extends WindowContainer // Drop any cached DisplayInfos associated with this display id - the values are now // out of date given this display changed event. mWmService.mPossibleDisplayInfoMapper.removePossibleDisplayInfos(displayId); + updateDisplayImePolicyCache(); } } + void updateDisplayImePolicyCache() { + ArrayMap displayImePolicyMap = new ArrayMap<>(); + forAllDisplays(dc -> displayImePolicyMap.put(dc.getDisplayId(), dc.getImePolicy())); + mWmService.mDisplayImePolicyCache = Collections.unmodifiableMap(displayImePolicyMap); + } + /** Update lists of UIDs that are present on displays and have access to them. */ void updateUIDsPresentOnDisplay() { mDisplayAccessUIDs.clear(); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 03c70e1010ccf..55b649f269bed 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -591,6 +591,13 @@ public class WindowManagerService extends IWindowManager.Stub */ final ArrayList mResizingWindows = new ArrayList<>(); + /** + * Mapping of displayId to {@link DisplayImePolicy}. + * Note that this can be accessed without holding the lock. + */ + volatile Map mDisplayImePolicyCache = Collections.unmodifiableMap( + new ArrayMap<>()); + /** * Windows whose surface should be destroyed. */ @@ -6947,6 +6954,7 @@ public class WindowManagerService extends IWindowManager.Stub void setForceDesktopModeOnExternalDisplays(boolean forceDesktopModeOnExternalDisplays) { synchronized (mGlobalLock) { mForceDesktopModeOnExternalDisplays = forceDesktopModeOnExternalDisplays; + mRoot.updateDisplayImePolicyCache(); } } @@ -7378,16 +7386,14 @@ public class WindowManagerService extends IWindowManager.Stub if (!checkCallingPermission(INTERNAL_SYSTEM_WINDOW, "getDisplayImePolicy()")) { throw new SecurityException("Requires INTERNAL_SYSTEM_WINDOW permission"); } - final DisplayContent dc = mRoot.getDisplayContent(displayId); - if (dc == null) { + final Map displayImePolicyCache = mDisplayImePolicyCache; + if (!displayImePolicyCache.containsKey(displayId)) { ProtoLog.w(WM_ERROR, "Attempted to get IME policy of a display that does not exist: %d", displayId); return DISPLAY_IME_POLICY_FALLBACK_DISPLAY; } - synchronized (mGlobalLock) { - return dc.getImePolicy(); - } + return displayImePolicyCache.get(displayId); } @Override @@ -7877,9 +7883,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public @DisplayImePolicy int getDisplayImePolicy(int displayId) { - synchronized (mGlobalLock) { - return WindowManagerService.this.getDisplayImePolicy(displayId); - } + return WindowManagerService.this.getDisplayImePolicy(displayId); } @Override