summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java9
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java40
2 files changed, 45 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index f2bc909bd64b..c87c2501d3b1 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -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 {
diff --git a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
index aa794b2d071d..bc172c120283 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
@@ -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;
@@ -245,13 +246,50 @@ 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() {
final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build();
final WindowState inputTarget = newWindowBuilder("app", TYPE_APPLICATION).build();