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

Commit 47f92890 authored by Felix Stern's avatar Felix Stern
Browse files

Reset IME requestedVisibility of RICT if imeInputTarget becomes null

When the IME input target changes to null, and the control target is the
RemoteInsetsControlTarget (RICT), we'll reset its requestedVisibility
for the IME to the default visibility (false). If the IME was requested
before, this could have caused inconsistencies when another window, that
has the IME not requested, becomes the input target later.

Fix: 420297992
Test: atest DisplayContentTests#testSetImeInputTargetNullResetsRemoteInsetsControlTargetImeVisibility
Flag: EXEMPT bug fix
Change-Id: Ife1598bb9560da877bafcbff2b66542c68de6d1d
parent d9709d9a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -4471,6 +4471,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
                mWmService.dispatchImeInputTargetVisibilityChanged(targetWin.mClient.asBinder(),
                        targetWin.isVisible() /* visible */, false /* removed */, mDisplayId);
            }
        } else if (mImeControlTarget != null && mImeControlTarget == mRemoteInsetsControlTarget) {
            // TODO(b/421886264) Verify the case when the current display policy doesn't allow
            //  showing the IME and use default display remoteInsetsControlTarget instead.
            // The IME is not visible by definition of WindowInsets.Type.defaultVisible()
            mImeControlTarget.setImeInputTargetRequestedVisibility(false /* visible */,
                    null /* statsToken */);
        }
        if (refreshImeSecureFlag(getPendingTransaction())) {
            mWmService.requestTraversal();
+31 −0
Original line number Diff line number Diff line
@@ -106,6 +106,7 @@ import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

import android.annotation.NonNull;
@@ -126,6 +127,7 @@ import android.os.UserManager;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.view.Display;
import android.view.DisplayCutout;
import android.view.DisplayInfo;
@@ -139,6 +141,7 @@ import android.view.Surface;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
import android.view.View;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams.WindowType;
import android.window.DisplayAreaInfo;
@@ -406,6 +409,34 @@ public class DisplayContentTests extends WindowTestsBase {
        assertNull("computeImeParent() should be null", mDisplayContent.computeImeParent());
    }

    @Test
    @UseTestDisplay(addWindows = W_INPUT_METHOD)
    @RequiresFlagsEnabled(android.view.inputmethod.Flags.FLAG_REPORT_ANIMATING_INSETS_TYPES)
    public void testSetImeInputTargetNullResetsRemoteInsetsControlTargetImeVisibility()
            throws RemoteException {
        final var displayWindowInsetsController = spy(createDisplayWindowInsetsController());
        mDisplayContent.setRemoteInsetsController(displayWindowInsetsController);

        final var appWin = newWindowBuilder("appWin", TYPE_APPLICATION)
                .setWindowingMode(WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW).build();
        final var remoteControlTarget = mDisplayContent.mRemoteInsetsControlTarget;

        // Set appWin as the IME input target.
        appWin.setRequestedVisibleTypes(WindowInsets.Type.ime());
        clearInvocations(displayWindowInsetsController);
        mDisplayContent.setImeInputTarget(appWin);
        mDisplayContent.setImeLayeringTarget(appWin);
        assertEquals("RemoteInsetsControlTarget should be the IME control target",
                remoteControlTarget, mDisplayContent.getImeControlTarget());
        assertTrue("appWin should have the IME requested visible",
                appWin.isRequestedVisible(WindowInsets.Type.ime()));

        // Set null input target
        mDisplayContent.setImeInputTarget(null /* target */);
        verify(displayWindowInsetsController).setImeInputTargetRequestedVisibility(
                eq(false) /* visible */, any());
    }

    @Test
    public void testUpdateImeParent_skipForOrganizedImeContainer() {
        final DisplayArea.Tokens imeContainer = mDisplayContent.getImeContainer();