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

Commit 68a4f679 authored by Cosmin Băieș's avatar Cosmin Băieș
Browse files

Reset imeShowing when not serverVisible

Previously we would only reset the imeShowing state of the
ImeInsetsSourceProvider if the server visibility changed during the
onPostLayout call. However, this can already be set to false from a
previous call, as is the case when the windowContainer is removed, and
set to null. In this case we wouldn't be serverVisible, but imeShowing
would have a stale true value.

This fixes the issue by replacing the wasServerVisible check with
verifying the current value of imeShowing.

Flag: EXEMPT bugfix
Bug: 406736702
Test: ImeInsetsSourceProvider#testOnPostLayout_resetImeShowingWhenAlreadyNotServerVisible
Change-Id: I5d3745e292d101c0f7a20cbc6a0a10adf6f89672
parent bfe2c0c9
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -129,10 +129,10 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider {
                ImeTracker.forLogging().onCancelled(mStatsToken,
                        ImeTracker.PHASE_WM_POST_LAYOUT_NOTIFY_CONTROLS_CHANGED);
                mStatsToken = null;
            } else if (wasServerVisible && !isServerVisible()) {
            } else if (isImeShowing() && !isServerVisible()) {
                ProtoLog.d(WM_DEBUG_IME,
                        "onPostLayout: setImeShowing(false) was: %s, controlTarget=%s",
                        isImeShowing(), mControlTarget);
                        "onPostLayout: setImeShowing(false) was: true, controlTarget=%s",
                        mControlTarget);
                setImeShowing(false);
            }
        }
+32 −0
Original line number Diff line number Diff line
@@ -317,6 +317,38 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase {
        assertTrue(mImeProvider.isSurfaceVisible());
    }

    /**
     * Verifies that {@code onPostLayout} can reset {@code isImeShowing} when the server visibility
     * was already set to false before the call.
     */
    @Test
    @RequiresFlagsEnabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)
    public void testOnPostLayout_resetImeShowingWhenAlreadyNotServerVisible() {
        final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build();
        final WindowState target = newWindowBuilder("app", TYPE_APPLICATION).build();
        makeWindowVisibleAndDrawn(ime);

        mImeProvider.setWindowContainer(ime, null, null);
        mImeProvider.setServerVisible(true);
        mImeProvider.updateControlForTarget(target, true /* force */, ImeTracker.Token.empty());

        mImeProvider.onPostLayout();
        assertTrue("Server visibility is still true after onPostLayout",
                mImeProvider.isServerVisible());
        assertTrue("IME showing is true after onPostLayout", mImeProvider.isImeShowing());

        // Removing the window container will set server visibility to false.
        mImeProvider.setWindowContainer(null, null, null);
        assertFalse("Server visibility is false after removing window container",
                mImeProvider.isServerVisible());
        assertTrue("IME showing is still true before onPostLayout", mImeProvider.isImeShowing());

        mImeProvider.onPostLayout();
        assertFalse("Server visibility is still false after onPostLayout",
                mImeProvider.isServerVisible());
        assertFalse("IME showing is false after onPostLayout", mImeProvider.isImeShowing());
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)
    public void testUpdateControlForTarget_differentControlTarget() throws RemoteException {