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

Commit 5679e2f8 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Do not keep focus on IME dialog if its target is invisible

Otherwise the input method target won't have a change to be
updated from IMMS for new focus window.

And if input method target doesn't update, the IME and IME
Switcher Menu will be invisible because they are put under
ImeContainer which is put on invisible app's surface.

Fix: 359711526
Flag: EXEMPT bugfix
Test: atest DisplayContentTests# \
      testImeMenuDialogFocusWhenImeLayeringTargetChanges

Change-Id: Ia5ea318b2a92ccc003f3192a198bf041365f70cf
parent aa960910
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -857,8 +857,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
            return false;
        }
        if (w.mAttrs.type == TYPE_INPUT_METHOD_DIALOG && mImeLayeringTarget != null
                && !mImeLayeringTarget.isRequestedVisible(ime())
                && !mImeLayeringTarget.isVisibleRequested()) {
                && !(mImeLayeringTarget.isRequestedVisible(ime())
                        && mImeLayeringTarget.isVisibleRequested())) {
            return false;
        }

+5 −3
Original line number Diff line number Diff line
@@ -2794,15 +2794,17 @@ public class DisplayContentTests extends WindowTestsBase {
        final WindowState imeAppTarget =
                createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "imeAppTarget");
        mDisplayContent.setImeLayeringTarget(imeAppTarget);
        spyOn(imeAppTarget);
        doReturn(true).when(imeAppTarget).isRequestedVisible(ime());
        imeAppTarget.setRequestedVisibleTypes(ime());
        assertEquals(imeMenuDialog, mDisplayContent.findFocusedWindow());

        // Verify imeMenuDialog doesn't be focused window if the next IME target is closing.
        final WindowState nextImeAppTarget =
                createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "nextImeAppTarget");
        makeWindowVisibleAndDrawn(nextImeAppTarget);
        nextImeAppTarget.mActivityRecord.commitVisibility(false, false);
        // Even if the app still requests IME, the ime dialog should not gain focus if the target
        // app is invisible.
        nextImeAppTarget.setRequestedVisibleTypes(ime());
        nextImeAppTarget.mActivityRecord.setVisibility(false);
        mDisplayContent.setImeLayeringTarget(nextImeAppTarget);
        assertNotEquals(imeMenuDialog, mDisplayContent.findFocusedWindow());
    }