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

Commit 53ee8b50 authored by Ang Li's avatar Ang Li Committed by Android (Google) Code Review
Browse files

Merge "Add test for providing IME insets to freeform windows" into main

parents 1d47d8a4 4958630c
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
@@ -19,8 +19,10 @@ package com.android.server.wm;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.view.InsetsSource.ID_IME;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import static android.view.WindowInsets.Type.captionBar;
import static android.view.WindowInsets.Type.ime;
import static android.view.WindowInsets.Type.navigationBars;
import static android.view.WindowInsets.Type.statusBars;
@@ -907,6 +909,69 @@ public class InsetsPolicyTest extends WindowTestsBase {
        assertEquals(Insets.NONE, imeInsetsHidden);
    }

    @Test
    public void testEnforceInsetsPolicyForTarget_imeInsetsForFreeform() {
        final InsetsPolicy policy = mDisplayContent.getInsetsPolicy();
        final InsetsState originalState = new InsetsState();
        final int captionBarId = InsetsSource.createId(null, 0, captionBar());
        final InsetsSource captionBarSource = new InsetsSource(captionBarId, captionBar());
        final InsetsSource imeSource = new InsetsSource(ID_IME, ime());
        imeSource.setVisible(true);
        originalState.addSource(imeSource);
        originalState.addSource(captionBarSource);

        // Create two windows in the same freeform task.
        final Task freeformTask = createTask(mDisplayContent, WINDOWING_MODE_FREEFORM,
                ACTIVITY_TYPE_STANDARD);
        final WindowState imeTargetWindow = createAppWindow(freeformTask, TYPE_APPLICATION,
                "imeTarget");
        final WindowState anotherWindowInSameTask = createAppWindow(freeformTask, TYPE_APPLICATION,
                "anotherWindow");

        // Create a window in a different freeform task.
        final Task anotherFreeformTask = createTask(mDisplayContent, WINDOWING_MODE_FREEFORM,
                ACTIVITY_TYPE_STANDARD);
        final WindowState windowInDifferentTask = createAppWindow(
                anotherFreeformTask, TYPE_APPLICATION, "windowInDifferentTask");

        // Set the IME target and request IME visibility.
        mDisplayContent.setImeInputTarget(imeTargetWindow);
        imeTargetWindow.setRequestedVisibleTypes(ime(), ime());

        // Case 1: A window in the same task as the IME target should receive IME insets.
        InsetsState resultState = policy.enforceInsetsPolicyForTarget(
                anotherWindowInSameTask, originalState);
        assertEquals(
                "Window in same task should get IME insets",
                imeSource, resultState.peekSource(ID_IME));
        // It should also keep other insets like caption bar for floating windows.
        resultState = policy.enforceInsetsPolicyForTarget(
                anotherWindowInSameTask, originalState);
        assertEquals("Window in same task should still get IME insets",
                imeSource, resultState.peekSource(ID_IME));
        assertEquals("Floating window should keep caption bar insets",
                captionBarSource, resultState.peekSource(captionBarId));

        // Case 2: The IME target window itself should receive IME insets.
        resultState = policy.enforceInsetsPolicyForTarget(imeTargetWindow, originalState);
        assertEquals("IME target window should get IME insets",
                imeSource, resultState.peekSource(ID_IME));

        // Case 3: A window in a different task should NOT receive IME insets.
        resultState = policy.enforceInsetsPolicyForTarget(windowInDifferentTask, originalState);
        assertNull("Window in different task should not get IME insets",
                resultState.peekSource(ID_IME));

        // Case 4: Pinned (PIP) window should not receive IME insets.
        final Task pinnedTask = createTask(mDisplayContent, WINDOWING_MODE_PINNED,
                ACTIVITY_TYPE_STANDARD);
        final WindowState pinnedWindow = createAppWindow(pinnedTask, TYPE_APPLICATION,
                "pinnedWindow");
        mDisplayContent.setImeInputTarget(pinnedWindow);
        resultState = policy.enforceInsetsPolicyForTarget(pinnedWindow, originalState);
        assertNull("Pinned window should not get IME insets", resultState.peekSource(ID_IME));
    }


    private WindowState addNavigationBar() {
        final Binder owner = new Binder();