summaryrefslogtreecommitdiffstats
path: root/core/java/android/view/inputmethod
diff options
context:
space:
mode:
authorYohei Yukawa <yukawa@google.com>2015-05-14 22:16:41 -0700
committerYohei Yukawa <yukawa@google.com>2015-05-15 10:22:23 -0700
commit5f05965f546fa42750f1a8314f8a2da01fd6bfb4 (patch)
treec3da4fea37c7f1e179c0c73ec44e645191b9abcb /core/java/android/view/inputmethod
parent92847c968754f3fc2ffe849cf54ef6dd49b3e744 (diff)
downloadframeworks_base-5f05965f546fa42750f1a8314f8a2da01fd6bfb4.zip
frameworks_base-5f05965f546fa42750f1a8314f8a2da01fd6bfb4.tar.gz
frameworks_base-5f05965f546fa42750f1a8314f8a2da01fd6bfb4.tar.bz2
Keep IMM#mCurRootView synchronized with the actual window focus.
Currently IMM#mCurRootView is always cleared every time when IMM#finishInputLocked() is called. We have been doing this since Iad09cf5dbb7f6f156fd39ed243431432e00f8945 so as not to hold the strong reference to a DecorView so long time (Bug 6413553). Strictly speaking, the attached window may continue holding input focus even after IMM#finishInputLocked() is called. In this state IMM#focusIn() might have unexpectedly rejected focus-in event but presumably this might not be obvious, or might not occur at all because in some situations IMM#finishInputLocked() has never been called even when the attached view loses input focus. In order to fix Issue 20820914, however, we need to call IMM#finishInputLocked() exactly when the attached view loses input focus. To make it easier to diagnose any unexpected regressions, this CL only changes the handling of IMM#mCurRootView, while the next CL Id6afc8fc64512225578c62557b96 plumbs IMM#focusOut() to IMM#finishInputLocked(). Manually tested following scenarios. - Repro steps in Bug 6413553. Made sure that IMM#mCurRootView is cleared after switching back from the current application to the previous application with back key. - Test application that calls WebView#showFindDialog(). Made sure that LatinIME works fine when switching text fields. This is non-trivial because android.webkit.FindActionModeCallback is changed in this CL. - Repro steps in Bug 21144633. Made sure that we can enter recipient's name in the messaging app. Bug: 20820914 Change-Id: I219394178e4172bc47864297f1418e677dba25e5
Diffstat (limited to 'core/java/android/view/inputmethod')
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java27
1 files changed, 20 insertions, 7 deletions
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 568e160..824b434 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -1289,14 +1289,14 @@ public final class InputMethodManager {
void focusInLocked(View view) {
if (DEBUG) Log.v(TAG, "focusIn: " + view);
-
+
if (mCurRootView != view.getRootView()) {
// This is a request from a window that isn't in the window with
// IME focus, so ignore it.
if (DEBUG) Log.v(TAG, "Not IME target window, ignoring");
return;
}
-
+
mNextServedView = view;
scheduleCheckFocusLocked(view);
}
@@ -1392,7 +1392,7 @@ public final class InputMethodManager {
* Called by ViewAncestor when its window gets input focus.
* @hide
*/
- public void onWindowFocus(View rootView, View focusedView, int softInputMode,
+ public void onPostWindowFocus(View rootView, View focusedView, int softInputMode,
boolean first, int windowFlags) {
boolean forceNewFocus = false;
synchronized (mH) {
@@ -1441,14 +1441,27 @@ public final class InputMethodManager {
}
}
}
-
+
/** @hide */
- public void startGettingWindowFocus(View rootView) {
+ public void onPreWindowFocus(View rootView, boolean hasWindowFocus) {
synchronized (mH) {
- mCurRootView = rootView;
+ if (rootView == null) {
+ mCurRootView = null;
+ } if (hasWindowFocus) {
+ mCurRootView = rootView;
+ } else if (rootView == mCurRootView) {
+ // If the mCurRootView is losing window focus, release the strong reference to it
+ // so as not to prevent it from being garbage-collected.
+ mCurRootView = null;
+ } else {
+ if (DEBUG) {
+ Log.v(TAG, "Ignoring onPreWindowFocus()."
+ + " mCurRootView=" + mCurRootView + " rootView=" + rootView);
+ }
+ }
}
}
-
+
/**
* Report the current selection range.
*