Don't give IME focus to temporarily detached View.

The root cause of Bug 18920212 is that when AutoCompleteTextView tries
to show completion window upon text input,
InputMethodManager#focusInLocked() can be called with a View that is
temporarily detached, which should be ignored.

Bug: 18920212
Change-Id: Ia79bbd8468f768d546354382b47b39dd31ef7bb5
This commit is contained in:
Yohei Yukawa
2016-03-29 19:06:36 -07:00
parent 807c3a828b
commit a4ed0cfcb6

View File

@ -1307,6 +1307,12 @@ public final class InputMethodManager {
void focusInLocked(View view) {
if (DEBUG) Log.v(TAG, "focusIn: " + dumpViewInfo(view));
if (view != null && view.isTemporarilyDetached()) {
// This is a request from a view that is temporarily detached from a window.
if (DEBUG) Log.v(TAG, "Temporarily detached view, ignoring");
return;
}
if (mCurRootView != view.getRootView()) {
// This is a request from a window that isn't in the window with
// IME focus, so ignore it.
@ -1332,6 +1338,7 @@ public final class InputMethodManager {
// whenever we go into touch mode, so it ends up hiding
// at times when we don't really want it to. For now it
// seems better to just turn it all off.
// TODO: Check view.isTemporarilyDetached() when re-enable the following code.
if (false && view.hasWindowFocus()) {
mNextServedView = null;
scheduleCheckFocusLocked(view);
@ -2315,6 +2322,7 @@ public final class InputMethodManager {
sb.append(",focus=" + view.hasFocus());
sb.append(",windowFocus=" + view.hasWindowFocus());
sb.append(",window=" + view.getWindowToken());
sb.append(",temporaryDetach=" + view.isTemporarilyDetached());
return sb.toString();
}
}