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

Commit 7bc66be8 authored by Taran Singh's avatar Taran Singh
Browse files

Hide IME after re-parenting IME container to DisplayArea

When IME is reparented to new DisplayAreaGoup, its surface is set visible
again. In order to prevent it fom flashing, it should be explicitly
hidden.
IME will reappear with animation once its attached to new app in new
DisplayArea

Bug: 174533580
Test: Manually using steps in bug
      atest DualDisplayAreaGroupPolicyTest

Change-Id: Icfe3ca6334a400f3241d67b3f5a8f5b08958919c
parent c424a394
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -3686,10 +3686,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        // config. (Only happens when the target window is in a different root DA)
        if (target != null) {
            RootDisplayArea targetRoot = target.getRootDisplayArea();
            if (targetRoot != null) {
            if (targetRoot != null && targetRoot != mImeWindowsContainer.getRootDisplayArea()) {
                // Reposition the IME container to the target root to get the correct bounds and
                // config.
                targetRoot.placeImeContainer(mImeWindowsContainer);
                // Directly hide the IME window so it doesn't flash immediately after reparenting.
                // InsetsController will make IME visible again before animating it.
                if (mInputMethodWindow != null) {
                    mInputMethodWindow.hide(false /* doAnimation */, false /* requestAnim */);
                }
            }
        }
        // 2. Assign window layers based on the IME surface parent to make sure it is on top of the
+0 −4
Original line number Diff line number Diff line
@@ -79,10 +79,6 @@ class RootDisplayArea extends DisplayArea<DisplayArea> {
     */
    void placeImeContainer(DisplayArea.Tokens imeContainer) {
        final RootDisplayArea previousRoot = imeContainer.getRootDisplayArea();
        if (previousRoot == this) {
            // No need to reparent if IME container is below the same root.
            return;
        }

        List<Feature> features = mFeatures;
        for (int i = 0; i < features.size(); i++) {
+0 −15
Original line number Diff line number Diff line
@@ -328,21 +328,6 @@ public class DisplayContentTests extends WindowTestsBase {
        assertEquals(startingWin, imeTarget);
    }

    @UseTestDisplay(addAllCommonWindows = true)
    @Test
    public void testComputeImeTarget_placeImeToTheTargetRoot() {
        ActivityRecord activity = createActivityRecord(mDisplayContent);

        final WindowState startingWin = createWindow(null, TYPE_APPLICATION_STARTING, activity,
                "startingWin");
        startingWin.setHasSurface(true);
        assertTrue(startingWin.canBeImeTarget());
        DisplayArea.Tokens imeContainer = mDisplayContent.getImeContainer();

        WindowState imeTarget = mDisplayContent.computeImeTarget(true /* updateImeTarget */);
        verify(imeTarget.getRootDisplayArea()).placeImeContainer(imeContainer);
    }

    @Test
    public void testUpdateImeParent_forceUpdateRelativeLayer() {
        final DisplayArea.Tokens imeContainer = mDisplayContent.getImeContainer();
+35 −0
Original line number Diff line number Diff line
@@ -310,6 +310,41 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase {
        assertThat(mSecondRoot.findAreaForToken(imeToken)).isEqualTo(imeContainer);
    }

    @Test
    public void testPlaceImeContainer_hidesImeWhenParentChanges() {
        setupImeWindow();
        final DisplayArea.Tokens imeContainer = mDisplay.getImeContainer();
        final WindowToken imeToken = tokenOfType(TYPE_INPUT_METHOD);
        final WindowState firstActivityWin =
                createWindow(null /* parent */, TYPE_APPLICATION_STARTING, mFirstActivity,
                        "firstActivityWin");
        spyOn(firstActivityWin);
        final WindowState secondActivityWin =
                createWindow(null /* parent */, TYPE_APPLICATION_STARTING, mSecondActivity,
                        "secondActivityWin");
        spyOn(secondActivityWin);

        // firstActivityWin should be the target
        doReturn(true).when(firstActivityWin).canBeImeTarget();
        doReturn(false).when(secondActivityWin).canBeImeTarget();

        WindowState imeTarget = mDisplay.computeImeTarget(true /* updateImeTarget */);
        assertThat(imeTarget).isEqualTo(firstActivityWin);
        verify(mFirstRoot).placeImeContainer(imeContainer);

        // secondActivityWin should be the target
        doReturn(false).when(firstActivityWin).canBeImeTarget();
        doReturn(true).when(secondActivityWin).canBeImeTarget();

        spyOn(mDisplay.mInputMethodWindow);
        imeTarget = mDisplay.computeImeTarget(true /* updateImeTarget */);

        assertThat(imeTarget).isEqualTo(secondActivityWin);
        verify(mSecondRoot).placeImeContainer(imeContainer);
        // verify hide() was called on InputMethodWindow.
        verify(mDisplay.mInputMethodWindow).hide(false /* doAnimation */, false /* requestAnim */);
    }

    @Test
    public void testResizableFixedOrientationApp_fixedOrientationLetterboxing() {
        mFirstRoot.setIgnoreOrientationRequest(false /* ignoreOrientationRequest */);