diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 857467208b6ea..344ee01a10c86 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -122,6 +122,7 @@ import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_FOCUS; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_FOCUS_LIGHT; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ORIENTATION; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_SCREEN_ON; +import static com.android.server.wm.ProtoLogGroup.WM_ERROR; import static com.android.server.wm.ProtoLogGroup.WM_SHOW_TRANSACTIONS; import static com.android.server.wm.RootWindowContainer.TAG_STATES; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; @@ -3416,6 +3417,57 @@ class DisplayContent extends WindowContainer implements WindowManagerP } } + @Override + public WindowState getWindow() { + return this; + } + @Override public void showInsets(@InsetsType int types, boolean fromIme) { try { @@ -5334,6 +5339,24 @@ class WindowState extends WindowContainer implements WindowManagerP return false; } + /** + * Get IME target that should host IME when this window's display has a parent. + * Note: IME is never hosted by a display that has a parent. + * When window calling + * {@link android.view.inputmethod.InputMethodManager#showSoftInput(View, int)} is unknown, + * use {@link DisplayContent#getImeControlTarget()} instead. + * + * @return {@link WindowState} of host that controls the IME. + * When window is doesn't have a parent, it is returned as-is. + */ + WindowState getImeControlTarget() { + final DisplayContent dc = getDisplayContent(); + final WindowState parentWindow = dc.getParentWindow(); + + // If target's display has a parent, IME is displayed in the parent display. + return dc.getImeHostOrFallback(parentWindow != null ? parentWindow : this); + } + @Override void assignLayer(Transaction t, int layer) { // See comment in assignRelativeLayerForImeTargetChild diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index 20eab5a45ff19..8e362ae4c59a0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -110,7 +110,7 @@ class WindowTestsBase extends SystemServiceTestsBase { beforeCreateDisplay(); context.getDisplay().getDisplayInfo(mDisplayInfo); - mDisplayContent = createNewDisplay(); + mDisplayContent = createNewDisplay(true /* supportIme */); // Set-up some common windows. mCommonWindows = new HashSet<>(); @@ -349,16 +349,29 @@ class WindowTestsBase extends SystemServiceTestsBase { return WindowTestUtils.createTaskInStack(mWm, stack, userId); } - /** Creates a {@link DisplayContent} and adds it to the system. */ + /** Creates a {@link DisplayContent} that supports IME and adds it to the system. */ DisplayContent createNewDisplay() { - return createNewDisplay(mDisplayInfo); + return createNewDisplay(true /* supportIme */); } /** Creates a {@link DisplayContent} and adds it to the system. */ + private DisplayContent createNewDisplay(boolean supportIme) { + return createNewDisplay(mDisplayInfo, supportIme); + } + + /** Creates a {@link DisplayContent} that supports IME and adds it to the system. */ DisplayContent createNewDisplay(DisplayInfo info) { + return createNewDisplay(info, true /* supportIme */); + } + + /** Creates a {@link DisplayContent} and adds it to the system. */ + private DisplayContent createNewDisplay(DisplayInfo info, boolean supportIme) { final DisplayContent display = new TestDisplayContent.Builder(mWm.mAtmService, info).build(); - return display.mDisplayContent; + final DisplayContent dc = display.mDisplayContent; + // this display can show IME. + dc.mWmService.mDisplayWindowSettings.setShouldShowImeLocked(dc, supportIme); + return dc; } /** @@ -372,7 +385,7 @@ class WindowTestsBase extends SystemServiceTestsBase { DisplayInfo displayInfo = new DisplayInfo(); displayInfo.copyFrom(mDisplayInfo); displayInfo.state = displayState; - return createNewDisplay(displayInfo); + return createNewDisplay(displayInfo, true /* supportIme */); } /** Creates a {@link com.android.server.wm.WindowTestUtils.TestWindowState} */ @@ -389,7 +402,7 @@ class WindowTestsBase extends SystemServiceTestsBase { displayInfo.copyFrom(mDisplayInfo); displayInfo.type = Display.TYPE_VIRTUAL; displayInfo.ownerUid = SYSTEM_UID; - return createNewDisplay(displayInfo); + return createNewDisplay(displayInfo, false /* supportIme */); } /** Sets the default minimum task size to 1 so that tests can use small task sizes */