Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 98df02eb authored by Chavi Weingarten's avatar Chavi Weingarten Committed by Android (Google) Code Review
Browse files

Merge "Check embedded windows for IME target" into rvc-dev

parents 3a2d5379 50dbc983
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -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.
+20 −0
Original line number Diff line number Diff line
@@ -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");