Loading services/core/java/com/android/server/wm/WindowState.java +22 −0 Original line number Diff line number Diff line Loading @@ -2262,7 +2262,29 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mHasSurface = hasSurface; } /** * Checks whether one of the Windows in a Display embedded in this Window can be an IME target. */ private boolean canWindowInEmbeddedDisplayBeImeTarget() { final int embeddedDisplayContentsSize = mEmbeddedDisplayContents.size(); for (int i = embeddedDisplayContentsSize - 1; i >= 0; i--) { final DisplayContent edc = mEmbeddedDisplayContents.valueAt(i); if (edc.forAllWindows(WindowState::canBeImeTarget, true)) { return true; } } return false; } boolean canBeImeTarget() { // If any of the embedded windows can be the IME target, this window will be the final IME // target. This is because embedded windows are on a different display in WM so it would // cause confusion trying to set the IME to a window on a different display. Instead, just // make the host window the IME target. if (canWindowInEmbeddedDisplayBeImeTarget()) { return true; } if (mIsImWindow) { // IME windows can't be IME targets. IME targets are required to be below the IME // windows and that wouldn't be possible if the IME window is its own target...silly. Loading services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +20 −0 Original line number Diff line number Diff line Loading @@ -269,6 +269,26 @@ public class WindowStateTests extends WindowTestsBase { assertTrue(stack.shouldIgnoreInput()); } @Test public void testCanWindowWithEmbeddedDisplayBeImeTarget() { final WindowState appWindow = createWindow(null, TYPE_APPLICATION, "appWindow"); final WindowState imeWindow = createWindow(null, TYPE_INPUT_METHOD, "imeWindow"); imeWindow.setHasSurface(true); appWindow.setHasSurface(true); appWindow.mAttrs.flags |= FLAG_NOT_FOCUSABLE; assertFalse(appWindow.canBeImeTarget()); DisplayContent secondDisplay = createNewDisplay(); final WindowState embeddedWindow = createWindow(null, TYPE_APPLICATION, secondDisplay, "embeddedWindow"); appWindow.addEmbeddedDisplayContent(secondDisplay); embeddedWindow.setHasSurface(true); embeddedWindow.mAttrs.flags &= ~FLAG_NOT_FOCUSABLE; assertTrue(appWindow.canBeImeTarget()); } @Test public void testGetWindow() { final WindowState root = createWindow(null, TYPE_APPLICATION, "root"); Loading Loading
services/core/java/com/android/server/wm/WindowState.java +22 −0 Original line number Diff line number Diff line Loading @@ -2262,7 +2262,29 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mHasSurface = hasSurface; } /** * Checks whether one of the Windows in a Display embedded in this Window can be an IME target. */ private boolean canWindowInEmbeddedDisplayBeImeTarget() { final int embeddedDisplayContentsSize = mEmbeddedDisplayContents.size(); for (int i = embeddedDisplayContentsSize - 1; i >= 0; i--) { final DisplayContent edc = mEmbeddedDisplayContents.valueAt(i); if (edc.forAllWindows(WindowState::canBeImeTarget, true)) { return true; } } return false; } boolean canBeImeTarget() { // If any of the embedded windows can be the IME target, this window will be the final IME // target. This is because embedded windows are on a different display in WM so it would // cause confusion trying to set the IME to a window on a different display. Instead, just // make the host window the IME target. if (canWindowInEmbeddedDisplayBeImeTarget()) { return true; } if (mIsImWindow) { // IME windows can't be IME targets. IME targets are required to be below the IME // windows and that wouldn't be possible if the IME window is its own target...silly. Loading
services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +20 −0 Original line number Diff line number Diff line Loading @@ -269,6 +269,26 @@ public class WindowStateTests extends WindowTestsBase { assertTrue(stack.shouldIgnoreInput()); } @Test public void testCanWindowWithEmbeddedDisplayBeImeTarget() { final WindowState appWindow = createWindow(null, TYPE_APPLICATION, "appWindow"); final WindowState imeWindow = createWindow(null, TYPE_INPUT_METHOD, "imeWindow"); imeWindow.setHasSurface(true); appWindow.setHasSurface(true); appWindow.mAttrs.flags |= FLAG_NOT_FOCUSABLE; assertFalse(appWindow.canBeImeTarget()); DisplayContent secondDisplay = createNewDisplay(); final WindowState embeddedWindow = createWindow(null, TYPE_APPLICATION, secondDisplay, "embeddedWindow"); appWindow.addEmbeddedDisplayContent(secondDisplay); embeddedWindow.setHasSurface(true); embeddedWindow.mAttrs.flags &= ~FLAG_NOT_FOCUSABLE; assertTrue(appWindow.canBeImeTarget()); } @Test public void testGetWindow() { final WindowState root = createWindow(null, TYPE_APPLICATION, "root"); Loading