diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/DisplayContent.java | 10 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java | 25 |
2 files changed, 34 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index ed1bbf8e4b74..2975a95426bb 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -4272,7 +4272,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp setImeInputTarget(target); mInsetsStateController.updateAboveInsetsState(mInsetsStateController .getRawInsetsState().getSourceOrDefaultVisibility(ITYPE_IME)); - updateImeControlTarget(); + // Force updating the IME parent when the IME control target has been updated to the + // remote target but updateImeParent not happen because ImeLayeringTarget and + // ImeInputTarget are different. Then later updateImeParent would be ignored when there + // is no new IME control target to change the IME parent. + final boolean forceUpdateImeParent = mImeControlTarget == mRemoteInsetsControlTarget + && (mInputMethodSurfaceParent != null + && !mInputMethodSurfaceParent.isSameSurface( + mImeWindowsContainer.getParent().mSurfaceControl)); + updateImeControlTarget(forceUpdateImeParent); } // Unfreeze IME insets after the new target updated, in case updateAboveInsetsState may // deliver unrelated IME insets change to the non-IME requester. diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 263c9364c965..c5f785ea7680 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -1184,6 +1184,31 @@ public class DisplayContentTests extends WindowTestsBase { } @Test + public void testComputeImeParent_remoteControlTarget() throws Exception { + final DisplayContent dc = mDisplayContent; + WindowState app1 = createWindow(null, TYPE_BASE_APPLICATION, "app1"); + WindowState app2 = createWindow(null, TYPE_BASE_APPLICATION, "app2"); + + dc.setImeLayeringTarget(app1); + dc.setImeInputTarget(app2); + dc.setRemoteInsetsController(createDisplayWindowInsetsController()); + dc.getImeTarget(IME_TARGET_LAYERING).getWindow().setWindowingMode( + WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW); + dc.getImeInputTarget().getWindowState().setWindowingMode( + WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW); + + // Expect ImeParent is null since ImeLayeringTarget and ImeInputTarget are different. + assertNull(dc.computeImeParent()); + + // ImeLayeringTarget and ImeInputTarget are updated to the same. + dc.setImeInputTarget(app1); + assertEquals(dc.getImeTarget(IME_TARGET_LAYERING), dc.getImeInputTarget()); + + // The ImeParent should be the display. + assertEquals(dc.getImeContainer().getParent().getSurfaceControl(), dc.computeImeParent()); + } + + @Test public void testInputMethodInputTarget_isClearedWhenWindowStateIsRemoved() throws Exception { final DisplayContent dc = createNewDisplay(); |