summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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());
+ }
}