diff options
author | 2025-03-07 02:04:45 -0800 | |
---|---|---|
committer | 2025-03-07 02:04:45 -0800 | |
commit | 27381dc1cf794fe12867033ca841b547e6657c89 (patch) | |
tree | fc28fda3cb55f668ad1357c2e6fd38f164f8ea7d | |
parent | c8ba936b0f4bf49a2290a694174678ba22f8fa2e (diff) | |
parent | 957032e63d331a3ce5915879dfc6c048d793a156 (diff) |
Merge "Sync IME visibility to control target, when it changes" into main
-rw-r--r-- | services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java | 12 | ||||
-rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java | 33 |
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()); + } } |