Fix WM input limitations on secondary displays (1/N)
- One DisplayContent include one InputMonitor.
- For customized inputconsumers, they can be handled by DisplayContent.
- Extract InputManagerCallback to communicated InputManagerService.
- All windows need pass displayId to InputWindowHandle.
Bug: 111363643
Test: atest WindowManagerSmokeTest
Test: atest DisplayContentTests
Change-Id: Iaaca7d135a11c55a78bcf1f81918599b3d160106
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 31c0bdd..aa52b44 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -401,6 +401,8 @@
private MagnificationSpec mMagnificationSpec;
+ private InputMonitor mInputMonitor;
+
private final Consumer<WindowState> mUpdateWindowsForAnimator = w -> {
WindowStateAnimator winAnimator = w.mWinAnimator;
final AppWindowToken atoken = w.mAppToken;
@@ -798,6 +800,8 @@
// TODO(b/62541591): evaluate whether this is the best spot to declare the
// {@link DisplayContent} ready for use.
mDisplayReady = true;
+
+ mInputMonitor = new InputMonitor(service, mDisplayId);
}
boolean isReady() {
@@ -2362,6 +2366,8 @@
pw.println();
mDisplayFrames.dump(prefix, pw);
+ pw.println();
+ mInputMonitor.dump(pw, " ");
}
@Override
@@ -2472,9 +2478,9 @@
assignWindowLayers(false /* setLayoutNeeded */);
}
- mService.mInputMonitor.setUpdateInputWindowsNeededLw();
+ mInputMonitor.setUpdateInputWindowsNeededLw();
mService.mWindowPlacerLocked.performSurfacePlacement();
- mService.mInputMonitor.updateInputWindowsLw(false /*force*/);
+ mInputMonitor.updateInputWindowsLw(false /*force*/);
}
/** Returns true if a leaked surface was destroyed */
@@ -3057,10 +3063,10 @@
forAllWindows(mPerformLayoutAttached, true /* traverseTopToBottom */);
// Window frames may have changed. Tell the input dispatcher about it.
- mService.mInputMonitor.layoutInputConsumers(dw, dh);
- mService.mInputMonitor.setUpdateInputWindowsNeededLw();
+ mInputMonitor.layoutInputConsumers(dw, dh);
+ mInputMonitor.setUpdateInputWindowsNeededLw();
if (updateInputWindows) {
- mService.mInputMonitor.updateInputWindowsLw(false /*force*/);
+ mInputMonitor.updateInputWindowsLw(false /*force*/);
}
mService.mH.sendEmptyMessage(UPDATE_DOCKED_STACK_DIVIDER);
@@ -4107,4 +4113,8 @@
private boolean canUpdateImeTarget() {
return mDeferUpdateImeTargetCount == 0;
}
+
+ InputMonitor getInputMonitor() {
+ return mInputMonitor;
+ }
}