Fix FLAG_NOT_FOCUSABLE ime target

Windows with FLAG_NOT_FOCUSABLE can not be IME target unless alpha is
zero (i.e. app is using transparent window to detect IME for legacy
reasons).
Going forward we can improve this with the todo already mentioned in the
code block.

Bug: 145812508
Fix: 149899590
Test: Manually verified using steps in bug.

Change-Id: I0e7db484dd4f9b584998b9f922fd46030fb6fb72
This commit is contained in:
Tarandeep Singh
2020-02-24 18:35:43 -08:00
parent 01302a8618
commit f3a2b52e16
2 changed files with 5 additions and 3 deletions

View File

@@ -2256,9 +2256,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return false;
}
if (PixelFormat.formatHasAlpha(mAttrs.format)) {
// Support legacy use cases where transparent windows can still be ime target with
// FLAG_NOT_FOCUSABLE and ALT_FOCUSABLE_IM set.
if (PixelFormat.formatHasAlpha(mAttrs.format) && mAttrs.alpha == 0) {
// Support legacy use cases where completely transparent windows can still be ime target
// with FLAG_NOT_FOCUSABLE and ALT_FOCUSABLE_IM set.
// Certain apps listen for IME insets using transparent windows and ADJUST_NOTHING to
// manually synchronize app content to IME animation b/144619551.
// TODO(b/145812508): remove this once new focus management is complete b/141738570

View File

@@ -251,9 +251,11 @@ public class WindowStateTests extends WindowTestsBase {
// b/145812508: special legacy use-case for transparent/translucent windows.
appWindow.mAttrs.format = PixelFormat.TRANSPARENT;
appWindow.mAttrs.alpha = 0;
assertTrue(appWindow.canBeImeTarget());
appWindow.mAttrs.format = PixelFormat.OPAQUE;
appWindow.mAttrs.alpha = 1;
appWindow.mAttrs.flags &= ~FLAG_ALT_FOCUSABLE_IM;
assertFalse(appWindow.canBeImeTarget());
appWindow.mAttrs.flags &= ~FLAG_NOT_FOCUSABLE;