summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Felix Stern <fstern@google.com> 2025-03-07 02:04:45 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-03-07 02:04:45 -0800
commit27381dc1cf794fe12867033ca841b547e6657c89 (patch)
treefc28fda3cb55f668ad1357c2e6fd38f164f8ea7d
parentc8ba936b0f4bf49a2290a694174678ba22f8fa2e (diff)
parent957032e63d331a3ce5915879dfc6c048d793a156 (diff)
Merge "Sync IME visibility to control target, when it changes" into main
-rw-r--r--services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java12
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java33
2 files changed, 41 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 a937691e7998..1c90f40085db 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -288,11 +288,15 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider {
// If insets target is not available (e.g. RemoteInsetsControlTarget), use current
// 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.
- InsetsTarget insetsTarget = target.getWindow();
- if (insetsTarget == null && mServerVisible) {
- insetsTarget = mDisplayContent.getImeInputTarget();
+ InputTarget imeInputTarget = mDisplayContent.getImeInputTarget();
+ if (imeInputTarget != target && imeInputTarget != null) {
+ // The controlTarget should be updated with the visibility of the
+ // current IME input target.
+ reportImeInputTargetStateToControlTarget(imeInputTarget, target,
+ statsToken);
+ } else {
+ invokeOnImeRequestedChangedListener(target, statsToken);
}
- invokeOnImeRequestedChangedListener(insetsTarget, statsToken);
}
}
}
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 7d59f4872d37..eb6d5cf8bb14 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
@@ -21,10 +21,18 @@ import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import android.graphics.PixelFormat;
+import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.view.WindowInsets;
import android.view.inputmethod.Flags;
import android.view.inputmethod.ImeTracker;
@@ -211,4 +219,29 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase {
mImeProvider.setFrozen(false);
assertFalse(mImeProvider.getSource().isVisible());
}
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)
+ public void testUpdateControlForTarget_remoteInsetsControlTarget() throws RemoteException {
+ final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build();
+ makeWindowVisibleAndDrawn(ime);
+ mImeProvider.setWindowContainer(ime, null, null);
+ mImeProvider.setServerVisible(true);
+ mImeProvider.setClientVisible(true);
+ final WindowState inputTarget = newWindowBuilder("app", TYPE_APPLICATION).build();
+ final var displayWindowInsetsController = spy(createDisplayWindowInsetsController());
+ mDisplayContent.setRemoteInsetsController(displayWindowInsetsController);
+ final var controlTarget = mDisplayContent.mRemoteInsetsControlTarget;
+
+ inputTarget.setRequestedVisibleTypes(
+ WindowInsets.Type.defaultVisible() | WindowInsets.Type.ime());
+ mDisplayContent.setImeInputTarget(inputTarget);
+ mDisplayContent.setImeControlTarget(controlTarget);
+
+ assertTrue(inputTarget.isRequestedVisible(WindowInsets.Type.ime()));
+ assertFalse(controlTarget.isRequestedVisible(WindowInsets.Type.ime()));
+ mImeProvider.updateControlForTarget(controlTarget, true /* force */, null /* statsToken */);
+ verify(displayWindowInsetsController, times(1)).setImeInputTargetRequestedVisibility(
+ eq(true), any());
+ }
}