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

Commit 3259563d authored by Riddle Hsu's avatar Riddle Hsu Committed by Automerger Merge Worker
Browse files

Merge "Update IME layer when non-app window requests visible IME" into udc-dev...

Merge "Update IME layer when non-app window requests visible IME" into udc-dev am: 74ebaefe am: c2c44857

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



Change-Id: I7f59af0adb57a833769fc2138bf21bd5577a91d1
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 9d7570c8 c2c44857
Loading
Loading
Loading
Loading
+15 −0
Original line number Original line Diff line number Diff line
@@ -90,6 +90,21 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider {
        return control;
        return control;
    }
    }


    @Override
    void setClientVisible(boolean clientVisible) {
        final boolean wasClientVisible = isClientVisible();
        super.setClientVisible(clientVisible);
        // The layer of ImePlaceholder needs to be updated on a higher z-order for
        // non-activity window (For activity window, IME is already on top of it).
        if (!wasClientVisible && isClientVisible()) {
            final InsetsControlTarget imeControlTarget = getControlTarget();
            if (imeControlTarget != null && imeControlTarget.getWindow() != null
                    && imeControlTarget.getWindow().mActivityRecord == null) {
                mDisplayContent.assignWindowLayers(false /* setLayoutNeeded */);
            }
        }
    }

    @Override
    @Override
    void setServerVisible(boolean serverVisible) {
    void setServerVisible(boolean serverVisible) {
        mServerVisible = serverVisible;
        mServerVisible = serverVisible;
+17 −4
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@ import static android.view.WindowInsets.Type.navigationBars;
import static android.view.WindowInsets.Type.statusBars;
import static android.view.WindowInsets.Type.statusBars;
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;


@@ -38,6 +39,7 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.spy;
@@ -419,10 +421,10 @@ public class InsetsStateControllerTest extends WindowTestsBase {


    @Test
    @Test
    public void testUpdateAboveInsetsState_zOrderChanged() {
    public void testUpdateAboveInsetsState_zOrderChanged() {
        final WindowState ime = createTestWindow("ime");
        final WindowState ime = createNonAppWindow("ime");
        final WindowState app = createTestWindow("app");
        final WindowState app = createNonAppWindow("app");
        final WindowState statusBar = createTestWindow("statusBar");
        final WindowState statusBar = createNonAppWindow("statusBar");
        final WindowState navBar = createTestWindow("navBar");
        final WindowState navBar = createNonAppWindow("navBar");


        final InsetsSourceProvider imeSourceProvider =
        final InsetsSourceProvider imeSourceProvider =
                getController().getOrCreateSourceProvider(ID_IME, ime());
                getController().getOrCreateSourceProvider(ID_IME, ime());
@@ -430,7 +432,9 @@ public class InsetsStateControllerTest extends WindowTestsBase {


        waitUntilHandlersIdle();
        waitUntilHandlersIdle();
        clearInvocations(mDisplayContent);
        clearInvocations(mDisplayContent);
        imeSourceProvider.updateControlForTarget(app, false /* force */);
        imeSourceProvider.setClientVisible(true);
        imeSourceProvider.setClientVisible(true);
        verify(mDisplayContent).assignWindowLayers(anyBoolean());
        waitUntilHandlersIdle();
        waitUntilHandlersIdle();
        // The visibility change should trigger a traversal to notify the change.
        // The visibility change should trigger a traversal to notify the change.
        verify(mDisplayContent).notifyInsetsChanged(any());
        verify(mDisplayContent).notifyInsetsChanged(any());
@@ -546,6 +550,7 @@ public class InsetsStateControllerTest extends WindowTestsBase {
                control2.getInsetsHint().bottom);
                control2.getInsetsHint().bottom);
    }
    }


    /** Creates a window which is associated with ActivityRecord. */
    private WindowState createTestWindow(String name) {
    private WindowState createTestWindow(String name) {
        final WindowState win = createWindow(null, TYPE_APPLICATION, name);
        final WindowState win = createWindow(null, TYPE_APPLICATION, name);
        win.setHasSurface(true);
        win.setHasSurface(true);
@@ -553,6 +558,14 @@ public class InsetsStateControllerTest extends WindowTestsBase {
        return win;
        return win;
    }
    }


    /** Creates a non-activity window. */
    private WindowState createNonAppWindow(String name) {
        final WindowState win = createWindow(null, LAST_APPLICATION_WINDOW + 1, name);
        win.setHasSurface(true);
        spyOn(win);
        return win;
    }

    private InsetsStateController getController() {
    private InsetsStateController getController() {
        return mDisplayContent.getInsetsStateController();
        return mDisplayContent.getInsetsStateController();
    }
    }