From 28cf5283450e79103ef993f2dfca0e39abf8564f Mon Sep 17 00:00:00 2001 From: Felix Stern Date: Tue, 8 Oct 2024 10:38:55 +0000 Subject: Add InsetsPolicyTest#testExcludeImeInsets This tests verifies that after setting WindowContainer#mExcludeInsetsTypes, the IME insets have a height of zero. Test: atest InsetsPolicyTest#testExcludeImeInsets Bug: 369974092 Flag: android.view.inputmethod.refactor_insets_controller Change-Id: Ibbf47b8fa0b6b23baa75a7019bb86d48fcfa90d6 --- services/tests/wmtests/Android.bp | 1 + .../com/android/server/wm/InsetsPolicyTest.java | 55 ++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/services/tests/wmtests/Android.bp b/services/tests/wmtests/Android.bp index ab00bfdf41ae..1f167761fc06 100644 --- a/services/tests/wmtests/Android.bp +++ b/services/tests/wmtests/Android.bp @@ -71,6 +71,7 @@ android_test { "CtsSurfaceValidatorLib", "service-sdksandbox.impl", "com.android.window.flags.window-aconfig-java", + "android.view.inputmethod.flags-aconfig-java", "flag-junit", ], diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java index d2cf03dd4b9a..ee56210e278d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java @@ -41,11 +41,13 @@ import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.verify; import android.app.StatusBarManager; +import android.graphics.Insets; import android.graphics.Rect; import android.os.Binder; 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.InsetsFrameProvider; import android.view.InsetsSource; import android.view.InsetsSourceControl; @@ -525,6 +527,59 @@ public class InsetsPolicyTest extends WindowTestsBase { assertTrue(win1.getWindowFrames().hasInsetsChanged()); } + /** + * This test verifies that after setting {@link WindowContainer#mExcludeInsetsTypes}, the IME + * insets have a height of zero (applied in {@link InsetsPolicy#adjustVisibilityForIme}). + */ + @RequiresFlagsEnabled(android.view.inputmethod.Flags.FLAG_REFACTOR_INSETS_CONTROLLER) + @SetupWindows(addWindows = W_INPUT_METHOD) + @Test + public void testExcludeImeInsets() { + final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy(); + final InsetsSource imeSource = new InsetsSource(ID_IME, ime()); + imeSource.setVisible(true); + mImeWindow.mHasSurface = true; + + final WindowState win = addWindow(TYPE_APPLICATION, "win1"); + win.setRequestedVisibleTypes(0, ime()); + + win.mAboveInsetsState.addSource(imeSource); + win.mHasSurface = true; + + DisplayContentTests.performLayout(mDisplayContent); + // IME should cover half of the app's window + final var winFrame = win.getFrame(); + imeSource.setFrame(winFrame.left, winFrame.bottom / 2, winFrame.right, winFrame.bottom); + imeSource.setVisibleFrame(imeSource.getFrame()); + DisplayContentTests.performLayout(mDisplayContent); + + assertTrue(mImeWindow.isVisible()); + assertTrue(win.isVisible()); + + displayPolicy.beginPostLayoutPolicyLw(); + displayPolicy.applyPostLayoutPolicyLw(win, win.mAttrs, null, null); + displayPolicy.finishPostLayoutPolicyLw(); + + final var imeInsetsShown = win.getInsetsState().calculateInsets(win.getFrame(), ime(), + true); + assertEquals(new Rect(0, 0, 0, winFrame.bottom / 2), imeInsetsShown.toRect()); + + + // Now we're setting the excludedInsetsTypes for the IME. The IME is still showing, but + // in this case, InsetsPolicy#adjustVisibilityForIme will override and dispatch IME + // insets with zero height. + win.setExcludeInsetsTypes(ime()); + + displayPolicy.beginPostLayoutPolicyLw(); + displayPolicy.applyPostLayoutPolicyLw(win, win.mAttrs, null, null); + displayPolicy.finishPostLayoutPolicyLw(); + + final var imeInsetsHidden = win.getInsetsState().calculateInsets(win.getFrame(), ime(), + true); + assertEquals(Insets.NONE, imeInsetsHidden); + } + + private WindowState addNavigationBar() { final Binder owner = new Binder(); final WindowState win = createWindow(null, TYPE_NAVIGATION_BAR, "navBar"); -- cgit v1.2.3-59-g8ed1b