diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 27c4bf42ac1b6..7afed3ccc6cae 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2191,6 +2191,9 @@ class WindowState extends WindowContainer implements WindowManagerP if (isInputMethodTarget()) { dc.computeImeTarget(true /* updateImeTarget */); } + if (dc.mInputMethodInputTarget == this) { + dc.setInputMethodInputTarget(null); + } if (dc.mInputMethodControlTarget == this) { dc.updateImeControlTarget(); } 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 792b597d23d21..f7b7b584fae54 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -949,6 +949,21 @@ public class DisplayContentTests extends WindowTestsBase { assertEquals(dc.getImeContainer().getParentSurfaceControl(), dc.computeImeParent()); } + @Test + public void testInputMethodInputTarget_isClearedWhenWindowStateIsRemoved() throws Exception { + final DisplayContent dc = createNewDisplay(); + + WindowState app = createWindow(null, TYPE_BASE_APPLICATION, dc, "app"); + + dc.mInputMethodInputTarget = app; + assertEquals(app, dc.computeImeControlTarget()); + + app.removeImmediately(); + + assertNull(dc.mInputMethodInputTarget); + assertNull(dc.computeImeControlTarget()); + } + @Test public void testComputeImeControlTarget() throws Exception { final DisplayContent dc = createNewDisplay();