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

Commit c3bbc9d1 authored by Chavi Weingarten's avatar Chavi Weingarten Committed by Automerger Merge Worker
Browse files

Merge "Check embedded windows for IME target" into rvc-dev am: 98df02eb

Change-Id: Ie24fd9e9c65353e3a134e80d0b42fd19739490cb
parents c08d4958 98df02eb
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");