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

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

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

View File

@@ -4289,7 +4289,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
setImeInputTarget(target);
mInsetsStateController.updateAboveInsetsState(mInsetsStateController
.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
// deliver unrelated IME insets change to the non-IME requester.

View File

@@ -1203,6 +1203,31 @@ public class DisplayContentTests extends WindowTestsBase {
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
public void testInputMethodInputTarget_isClearedWhenWindowStateIsRemoved() throws Exception {
final DisplayContent dc = createNewDisplay();