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

Commit 2ebbf793 authored by Ming-Shin Lu's avatar Ming-Shin Lu
Browse files

Fix seeing a weird window animation above TaskFragment transition

As DC#assignRelativeLayerForImeTargetChild will set relative layer for
non-IME focusable window to relatively above IME layer.

This layering setting could have a UI issue that during a
side-by-side TaskFragment changing transition, will see a weird
animation that non-IME focusable window is animating with being shifted
position on top of the TaskFragment.

In case seeing the window is animating above the app transition layer
because its relative layer is above the IME container on the display
area but actually not necessary, Add a check to not set the window
to be relatively above IME if the IME is not visible.

Fix: 225363555
Test: atest WindowStateTests ZOrderingTests
Test: manual as issue steps by using Google chat app with enabling
window extensions and side car library configuration on the device,
and verify if any weird window animation during launching in-call
activity fragment.

Change-Id: I641f54e18a18997f86779a355a23b17421fb35ec
parent d8ea5df3
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -5677,6 +5677,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
            return false;
            return false;
        }
        }


        // We don't need to set the window to be relatively above IME if the IME is not visible.
        // In case seeing the window is animating above the app transition layer because its
        // relative layer is above the IME container on the display area but actually not necessary.
        if (!getDisplayContent().getImeContainer().isVisible()) {
            return false;
        }

        if (isChildWindow()) {
        if (isChildWindow()) {
            // If we are a child of the input method target we need this promotion.
            // If we are a child of the input method target we need this promotion.
            if (getParentWindow().isImeLayeringTarget()) {
            if (getParentWindow().isImeLayeringTarget()) {
+3 −1
Original line number Original line Diff line number Diff line
@@ -855,12 +855,13 @@ public class WindowStateTests extends WindowTestsBase {
        assertTrue(mAtm.mActiveUids.hasNonAppVisibleWindow(uid));
        assertTrue(mAtm.mActiveUids.hasNonAppVisibleWindow(uid));
    }
    }


    @UseTestDisplay(addWindows = W_ACTIVITY)
    @UseTestDisplay(addWindows = {W_ACTIVITY, W_INPUT_METHOD})
    @Test
    @Test
    public void testNeedsRelativeLayeringToIme_notAttached() {
    public void testNeedsRelativeLayeringToIme_notAttached() {
        WindowState sameTokenWindow = createWindow(null, TYPE_BASE_APPLICATION, mAppWindow.mToken,
        WindowState sameTokenWindow = createWindow(null, TYPE_BASE_APPLICATION, mAppWindow.mToken,
                "SameTokenWindow");
                "SameTokenWindow");
        mDisplayContent.setImeLayeringTarget(mAppWindow);
        mDisplayContent.setImeLayeringTarget(mAppWindow);
        makeWindowVisible(mImeWindow);
        sameTokenWindow.mActivityRecord.getRootTask().setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
        sameTokenWindow.mActivityRecord.getRootTask().setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
        assertTrue(sameTokenWindow.needsRelativeLayeringToIme());
        assertTrue(sameTokenWindow.needsRelativeLayeringToIme());
        sameTokenWindow.removeImmediately();
        sameTokenWindow.removeImmediately();
@@ -873,6 +874,7 @@ public class WindowStateTests extends WindowTestsBase {
        WindowState sameTokenWindow = createWindow(null, TYPE_APPLICATION_STARTING,
        WindowState sameTokenWindow = createWindow(null, TYPE_APPLICATION_STARTING,
                mAppWindow.mToken, "SameTokenWindow");
                mAppWindow.mToken, "SameTokenWindow");
        mDisplayContent.setImeLayeringTarget(mAppWindow);
        mDisplayContent.setImeLayeringTarget(mAppWindow);
        makeWindowVisible(mImeWindow);
        sameTokenWindow.mActivityRecord.getRootTask().setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
        sameTokenWindow.mActivityRecord.getRootTask().setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
        assertFalse(sameTokenWindow.needsRelativeLayeringToIme());
        assertFalse(sameTokenWindow.needsRelativeLayeringToIme());
    }
    }
+2 −0
Original line number Original line Diff line number Diff line
@@ -274,6 +274,7 @@ public class ZOrderingTests extends WindowTestsBase {
                "imeAppTargetChildBelowWindow");
                "imeAppTargetChildBelowWindow");


        mDisplayContent.setImeLayeringTarget(imeAppTarget);
        mDisplayContent.setImeLayeringTarget(imeAppTarget);
        makeWindowVisible(mImeWindow);
        mDisplayContent.assignChildLayers(mTransaction);
        mDisplayContent.assignChildLayers(mTransaction);


        // Ime should be above all app windows except for child windows that are z-ordered above it
        // Ime should be above all app windows except for child windows that are z-ordered above it
@@ -599,6 +600,7 @@ public class ZOrderingTests extends WindowTestsBase {
                WINDOWING_MODE_MULTI_WINDOW);
                WINDOWING_MODE_MULTI_WINDOW);
        mDisplayContent.setImeLayeringTarget(mAppWindow);
        mDisplayContent.setImeLayeringTarget(mAppWindow);
        mDisplayContent.setImeInputTarget(mAppWindow);
        mDisplayContent.setImeInputTarget(mAppWindow);
        makeWindowVisible(mImeWindow);


        // Create a popupWindow
        // Create a popupWindow
        assertWindowHigher(mImeWindow, mAppWindow);
        assertWindowHigher(mImeWindow, mAppWindow);