Merge "Fix keyboard is attached to wrong task in split" into tm-dev am: 969d1b8eed

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17821943

Change-Id: I6b9b2ff7bd84ade39b2ec3eb7f161c54a6624329
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
TreeHugger Robot
2022-05-04 04:52:09 +00:00
committed by Automerger Merge Worker
2 changed files with 34 additions and 1 deletions

View File

@@ -4272,7 +4272,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
setImeInputTarget(target); setImeInputTarget(target);
mInsetsStateController.updateAboveInsetsState(mInsetsStateController mInsetsStateController.updateAboveInsetsState(mInsetsStateController
.getRawInsetsState().getSourceOrDefaultVisibility(ITYPE_IME)); .getRawInsetsState().getSourceOrDefaultVisibility(ITYPE_IME));
updateImeControlTarget(); // Force updating the IME parent when the IME control target has been updated to the
// remote target but updateImeParent not happen because ImeLayeringTarget and
// ImeInputTarget are different. Then later updateImeParent would be ignored when there
// is no new IME control target to change the IME parent.
final boolean forceUpdateImeParent = mImeControlTarget == mRemoteInsetsControlTarget
&& (mInputMethodSurfaceParent != null
&& !mInputMethodSurfaceParent.isSameSurface(
mImeWindowsContainer.getParent().mSurfaceControl));
updateImeControlTarget(forceUpdateImeParent);
} }
// Unfreeze IME insets after the new target updated, in case updateAboveInsetsState may // Unfreeze IME insets after the new target updated, in case updateAboveInsetsState may
// deliver unrelated IME insets change to the non-IME requester. // deliver unrelated IME insets change to the non-IME requester.

View File

@@ -1183,6 +1183,31 @@ public class DisplayContentTests extends WindowTestsBase {
mDisplayContent.computeImeParent()); mDisplayContent.computeImeParent());
} }
@Test
public void testComputeImeParent_remoteControlTarget() throws Exception {
final DisplayContent dc = mDisplayContent;
WindowState app1 = createWindow(null, TYPE_BASE_APPLICATION, "app1");
WindowState app2 = createWindow(null, TYPE_BASE_APPLICATION, "app2");
dc.setImeLayeringTarget(app1);
dc.setImeInputTarget(app2);
dc.setRemoteInsetsController(createDisplayWindowInsetsController());
dc.getImeTarget(IME_TARGET_LAYERING).getWindow().setWindowingMode(
WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW);
dc.getImeInputTarget().getWindowState().setWindowingMode(
WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW);
// Expect ImeParent is null since ImeLayeringTarget and ImeInputTarget are different.
assertNull(dc.computeImeParent());
// ImeLayeringTarget and ImeInputTarget are updated to the same.
dc.setImeInputTarget(app1);
assertEquals(dc.getImeTarget(IME_TARGET_LAYERING), dc.getImeInputTarget());
// The ImeParent should be the display.
assertEquals(dc.getImeContainer().getParent().getSurfaceControl(), dc.computeImeParent());
}
@Test @Test
public void testInputMethodInputTarget_isClearedWhenWindowStateIsRemoved() throws Exception { public void testInputMethodInputTarget_isClearedWhenWindowStateIsRemoved() throws Exception {
final DisplayContent dc = createNewDisplay(); final DisplayContent dc = createNewDisplay();