From 1e5b1a842a07335b8c49ae4a20f439078b2670cc Mon Sep 17 00:00:00 2001 From: Tarandeep Singh Date: Fri, 24 Jan 2020 16:03:05 -0800 Subject: [PATCH] Move IME to a host display when target's display is reparented By default IME shows in same display as IME target app window. This CL moves IME to a more eligible display that can host and control IME. Host display is chosen based on support to host IME/system decor. If nothing else is eligible, we fallback to default display. Bug: 111084606 Test: Use bubbles test app to verify IME appears in main display. Change-Id: I5e1c0844beaae91eb63e5ac39587fa11834d31d2 --- .../com/android/server/wm/DisplayContent.java | 52 +++++++++++++++++++ .../server/wm/InsetsControlTarget.java | 7 +++ .../server/wm/InsetsSourceProvider.java | 6 +++ .../server/wm/WindowManagerService.java | 44 +++++++--------- .../com/android/server/wm/WindowState.java | 23 ++++++++ .../android/server/wm/WindowTestsBase.java | 25 ++++++--- 6 files changed, 126 insertions(+), 31 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index c50048eeab642..04fc1d2f202bd 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; @@ -3407,6 +3408,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 */