Loading services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +6 −3 Original line number Diff line number Diff line Loading @@ -326,9 +326,12 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider { // IME input target to update IME request state. For example, switch from a task // with showing IME to a split-screen task without showing IME. InputTarget imeInputTarget = mDisplayContent.getImeInputTarget(); if (imeInputTarget != target && imeInputTarget != null) { // The controlTarget should be updated with the visibility of the // current IME input target. if (imeInputTarget != target && imeInputTarget != null && imeInputTarget.isRequestedVisible(WindowInsets.Type.ime()) != target.isRequestedVisible(WindowInsets.Type.ime())) { // Only update the controlTarget, if it has a different requested visibility // than the imeInputTarget. Otherwise, updateClientVisibility won't invoke // the listener, as nothing changed. reportImeInputTargetStateToControlTarget(imeInputTarget, target, statsToken); } else { Loading services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java +39 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static com.android.server.wm.WindowStateAnimator.NO_SURFACE; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.never; Loading Loading @@ -245,11 +246,48 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase { assertTrue(inputTarget.isRequestedVisible(WindowInsets.Type.ime())); assertFalse(controlTarget.isRequestedVisible(WindowInsets.Type.ime())); mImeProvider.updateControlForTarget(controlTarget, true /* force */, null /* statsToken */); mImeProvider.updateControlForTarget(controlTarget, true /* force */, ImeTracker.Token.empty()); verify(displayWindowInsetsController, times(1)).setImeInputTargetRequestedVisibility( eq(true), any()); } @Test @RequiresFlagsEnabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER) public void testUpdateControlForTarget_remoteInsetsControlTargetUnchanged() throws RemoteException { final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build(); mImeProvider.setWindowContainer(ime, null, null); final WindowState inputTarget = newWindowBuilder("app", TYPE_APPLICATION).build(); final var displayWindowInsetsController = spy(createDisplayWindowInsetsController()); mDisplayContent.setRemoteInsetsController(displayWindowInsetsController); final var controlTarget = mDisplayContent.mRemoteInsetsControlTarget; mDisplayContent.setImeInputTarget(inputTarget); mDisplayContent.setImeControlTarget(controlTarget); // Test for visible inputTarget.setRequestedVisibleTypes(WindowInsets.Type.ime()); controlTarget.updateRequestedVisibleTypes(WindowInsets.Type.ime(), WindowInsets.Type.ime()); clearInvocations(mDisplayContent); assertTrue(inputTarget.isRequestedVisible(WindowInsets.Type.ime())); assertTrue((controlTarget.isRequestedVisible(WindowInsets.Type.ime()))); mImeProvider.updateControlForTarget(controlTarget, true /* force */, ImeTracker.Token.empty()); verify(displayWindowInsetsController, never()).setImeInputTargetRequestedVisibility( anyBoolean(), any()); // Test for not visible inputTarget.setRequestedVisibleTypes(0); controlTarget.updateRequestedVisibleTypes(0 /* visibleTypes */, WindowInsets.Type.ime()); clearInvocations(mDisplayContent); assertFalse(inputTarget.isRequestedVisible(WindowInsets.Type.ime())); assertFalse((controlTarget.isRequestedVisible(WindowInsets.Type.ime()))); mImeProvider.updateControlForTarget(controlTarget, true /* force */, ImeTracker.Token.empty()); verify(displayWindowInsetsController, never()).setImeInputTargetRequestedVisibility( anyBoolean(), any()); } @Test @RequiresFlagsEnabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER) public void testOnPostLayout_resetServerVisibilityWhenImeIsNotDrawn() { Loading Loading
services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +6 −3 Original line number Diff line number Diff line Loading @@ -326,9 +326,12 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider { // IME input target to update IME request state. For example, switch from a task // with showing IME to a split-screen task without showing IME. InputTarget imeInputTarget = mDisplayContent.getImeInputTarget(); if (imeInputTarget != target && imeInputTarget != null) { // The controlTarget should be updated with the visibility of the // current IME input target. if (imeInputTarget != target && imeInputTarget != null && imeInputTarget.isRequestedVisible(WindowInsets.Type.ime()) != target.isRequestedVisible(WindowInsets.Type.ime())) { // Only update the controlTarget, if it has a different requested visibility // than the imeInputTarget. Otherwise, updateClientVisibility won't invoke // the listener, as nothing changed. reportImeInputTargetStateToControlTarget(imeInputTarget, target, statsToken); } else { Loading
services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java +39 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static com.android.server.wm.WindowStateAnimator.NO_SURFACE; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.never; Loading Loading @@ -245,11 +246,48 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase { assertTrue(inputTarget.isRequestedVisible(WindowInsets.Type.ime())); assertFalse(controlTarget.isRequestedVisible(WindowInsets.Type.ime())); mImeProvider.updateControlForTarget(controlTarget, true /* force */, null /* statsToken */); mImeProvider.updateControlForTarget(controlTarget, true /* force */, ImeTracker.Token.empty()); verify(displayWindowInsetsController, times(1)).setImeInputTargetRequestedVisibility( eq(true), any()); } @Test @RequiresFlagsEnabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER) public void testUpdateControlForTarget_remoteInsetsControlTargetUnchanged() throws RemoteException { final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build(); mImeProvider.setWindowContainer(ime, null, null); final WindowState inputTarget = newWindowBuilder("app", TYPE_APPLICATION).build(); final var displayWindowInsetsController = spy(createDisplayWindowInsetsController()); mDisplayContent.setRemoteInsetsController(displayWindowInsetsController); final var controlTarget = mDisplayContent.mRemoteInsetsControlTarget; mDisplayContent.setImeInputTarget(inputTarget); mDisplayContent.setImeControlTarget(controlTarget); // Test for visible inputTarget.setRequestedVisibleTypes(WindowInsets.Type.ime()); controlTarget.updateRequestedVisibleTypes(WindowInsets.Type.ime(), WindowInsets.Type.ime()); clearInvocations(mDisplayContent); assertTrue(inputTarget.isRequestedVisible(WindowInsets.Type.ime())); assertTrue((controlTarget.isRequestedVisible(WindowInsets.Type.ime()))); mImeProvider.updateControlForTarget(controlTarget, true /* force */, ImeTracker.Token.empty()); verify(displayWindowInsetsController, never()).setImeInputTargetRequestedVisibility( anyBoolean(), any()); // Test for not visible inputTarget.setRequestedVisibleTypes(0); controlTarget.updateRequestedVisibleTypes(0 /* visibleTypes */, WindowInsets.Type.ime()); clearInvocations(mDisplayContent); assertFalse(inputTarget.isRequestedVisible(WindowInsets.Type.ime())); assertFalse((controlTarget.isRequestedVisible(WindowInsets.Type.ime()))); mImeProvider.updateControlForTarget(controlTarget, true /* force */, ImeTracker.Token.empty()); verify(displayWindowInsetsController, never()).setImeInputTargetRequestedVisibility( anyBoolean(), any()); } @Test @RequiresFlagsEnabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER) public void testOnPostLayout_resetServerVisibilityWhenImeIsNotDrawn() { Loading