Make sure to call back View#onCheckIsTextEditor() on the UI thread

Calling back View#onCheckIsTextEditor() from a non-UI thread is
a well known type of bugs that we have met in the past [1].

This time it turns out that it can still happen when
InputMethodManager#isActive() gets called on a background thread.

This CL should address such a remaining case.

 [1]: I098df41f935438bf1889fb030c7a3e7a0645a168
      3f733cc7ef

Bug: 286016109
Test: atest CtsInputMethodTestCases:FocusHandlingTest#testOnCheckIsTextEditorRunOnUIThreadWithInputMethodManagerIsActive
Change-Id: I015603c1b33ecdf4a4f5d5be5d85756a3b2b1615
(cherry picked from commit b9eecc6bc8)
This commit is contained in:
Yohei Yukawa
2023-06-12 16:43:13 -07:00
parent bdee1f2316
commit e92f5e8c2b

View File

@@ -2657,17 +2657,6 @@ public final class InputMethodManager {
}
}
if (windowGainingFocus == null) {
windowGainingFocus = view.getWindowToken();
if (windowGainingFocus == null) {
Log.e(TAG, "ABORT input: ServedView must be attached to a Window");
return false;
}
startInputFlags = getStartInputFlags(view, startInputFlags);
softInputMode = view.getViewRootImpl().mWindowAttributes.softInputMode;
windowFlags = view.getViewRootImpl().mWindowAttributes.flags;
}
// Now we need to get an input connection from the served view.
// This is complicated in a couple ways: we can't be holding our lock
// when calling out to the view, and we need to make sure we call into
@@ -2690,6 +2679,17 @@ public final class InputMethodManager {
return false;
}
if (windowGainingFocus == null) {
windowGainingFocus = view.getWindowToken();
if (windowGainingFocus == null) {
Log.e(TAG, "ABORT input: ServedView must be attached to a Window");
return false;
}
startInputFlags = getStartInputFlags(view, startInputFlags);
softInputMode = view.getViewRootImpl().mWindowAttributes.softInputMode;
windowFlags = view.getViewRootImpl().mWindowAttributes.flags;
}
// Okay we are now ready to call into the served view and have it
// do its stuff.
// Life is good: let's hook everything up!