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

Commit af126fba authored by Taran Singh's avatar Taran Singh Committed by Automerger Merge Worker
Browse files

Merge "Hide IME after re-parenting IME container to DisplayArea" into sc-dev am: cf55fa2e

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13855245

Change-Id: I2b5b14e396bd19b80a0658d4d3149571120a0df6
parents 44df68bd cf55fa2e
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -3724,10 +3724,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
@@ -330,21 +330,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 */);