Merge "Check embedded windows for IME target" into rvc-dev

This commit is contained in:
Chavi Weingarten
2020-05-20 22:05:30 +00:00
committed by Android (Google) Code Review
2 changed files with 42 additions and 0 deletions

View File

@@ -2262,7 +2262,29 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mHasSurface = hasSurface;
}
/**
* Checks whether one of the Windows in a Display embedded in this Window can be an IME target.
*/
private boolean canWindowInEmbeddedDisplayBeImeTarget() {
final int embeddedDisplayContentsSize = mEmbeddedDisplayContents.size();
for (int i = embeddedDisplayContentsSize - 1; i >= 0; i--) {
final DisplayContent edc = mEmbeddedDisplayContents.valueAt(i);
if (edc.forAllWindows(WindowState::canBeImeTarget, true)) {
return true;
}
}
return false;
}
boolean canBeImeTarget() {
// If any of the embedded windows can be the IME target, this window will be the final IME
// target. This is because embedded windows are on a different display in WM so it would
// cause confusion trying to set the IME to a window on a different display. Instead, just
// make the host window the IME target.
if (canWindowInEmbeddedDisplayBeImeTarget()) {
return true;
}
if (mIsImWindow) {
// IME windows can't be IME targets. IME targets are required to be below the IME
// windows and that wouldn't be possible if the IME window is its own target...silly.

View File

@@ -269,6 +269,26 @@ public class WindowStateTests extends WindowTestsBase {
assertTrue(stack.shouldIgnoreInput());
}
@Test
public void testCanWindowWithEmbeddedDisplayBeImeTarget() {
final WindowState appWindow = createWindow(null, TYPE_APPLICATION, "appWindow");
final WindowState imeWindow = createWindow(null, TYPE_INPUT_METHOD, "imeWindow");
imeWindow.setHasSurface(true);
appWindow.setHasSurface(true);
appWindow.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
assertFalse(appWindow.canBeImeTarget());
DisplayContent secondDisplay = createNewDisplay();
final WindowState embeddedWindow = createWindow(null, TYPE_APPLICATION, secondDisplay,
"embeddedWindow");
appWindow.addEmbeddedDisplayContent(secondDisplay);
embeddedWindow.setHasSurface(true);
embeddedWindow.mAttrs.flags &= ~FLAG_NOT_FOCUSABLE;
assertTrue(appWindow.canBeImeTarget());
}
@Test
public void testGetWindow() {
final WindowState root = createWindow(null, TYPE_APPLICATION, "root");