summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java33
-rw-r--r--core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java2
2 files changed, 29 insertions, 6 deletions
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 850256871b15..d9bde5825fde 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -33,6 +33,7 @@ import static android.view.inputmethod.InputMethodManagerProto.CUR_ID;
import static android.view.inputmethod.InputMethodManagerProto.FULLSCREEN_MODE;
import static android.view.inputmethod.InputMethodManagerProto.SERVED_CONNECTING;
+import static com.android.internal.inputmethod.StartInputReason.BOUND_TO_IMMS;
import static com.android.internal.inputmethod.StartInputReason.WINDOW_FOCUS_GAIN_REPORT_WITHOUT_CONNECTION;
import static com.android.internal.inputmethod.StartInputReason.WINDOW_FOCUS_GAIN_REPORT_WITH_CONNECTION;
@@ -450,6 +451,11 @@ public final class InputMethodManager {
int mInitialSelEnd;
/**
+ * Handler for {@link RemoteInputConnectionImpl#getInputConnection()}.
+ */
+ private Handler mServedInputConnectionHandler;
+
+ /**
* The instance that has previously been sent to the input method.
*/
private CursorAnchorInfo mCursorAnchorInfo = null;
@@ -1658,6 +1664,7 @@ public final class InputMethodManager {
if (mServedInputConnection != null) {
mServedInputConnection.deactivate();
mServedInputConnection = null;
+ mServedInputConnectionHandler = null;
}
}
@@ -2289,6 +2296,13 @@ public final class InputMethodManager {
"Starting input: finished by someone else. view=" + dumpViewInfo(view)
+ " servedView=" + dumpViewInfo(servedView)
+ " mServedConnecting=" + mServedConnecting);
+ if (mServedInputConnection != null && startInputReason == BOUND_TO_IMMS) {
+ // This is not an error. Once IME binds (MSG_BIND), InputConnection is fully
+ // established. So we report this to interested recipients.
+ reportInputConnectionOpened(
+ mServedInputConnection.getInputConnection(), mCurrentTextBoxAttribute,
+ mServedInputConnectionHandler, view);
+ }
return false;
}
@@ -2305,6 +2319,7 @@ public final class InputMethodManager {
if (mServedInputConnection != null) {
mServedInputConnection.deactivate();
mServedInputConnection = null;
+ mServedInputConnectionHandler = null;
}
RemoteInputConnectionImpl servedInputConnection;
if (ic != null) {
@@ -2323,11 +2338,13 @@ public final class InputMethodManager {
// TODO(b/199934664): See if we can remove this by providing a default impl.
}
icHandler = handler;
+ mServedInputConnectionHandler = icHandler;
servedInputConnection = new RemoteInputConnectionImpl(
icHandler != null ? icHandler.getLooper() : vh.getLooper(), ic, this, view);
} else {
servedInputConnection = null;
icHandler = null;
+ mServedInputConnectionHandler = null;
}
mServedInputConnection = servedInputConnection;
@@ -2397,16 +2414,21 @@ public final class InputMethodManager {
Log.v(TAG, "Calling View.onInputConnectionOpened: view= " + view
+ ", ic=" + ic + ", tba=" + tba + ", handler=" + icHandler);
}
- view.onInputConnectionOpenedInternal(ic, tba, icHandler);
- final ViewRootImpl viewRoot = view.getViewRootImpl();
- if (viewRoot != null) {
- viewRoot.getHandwritingInitiator().onInputConnectionCreated(view);
- }
+ reportInputConnectionOpened(ic, tba, icHandler, view);
}
return true;
}
+ private void reportInputConnectionOpened(
+ InputConnection ic, EditorInfo tba, Handler icHandler, View view) {
+ view.onInputConnectionOpenedInternal(ic, tba, icHandler);
+ final ViewRootImpl viewRoot = view.getViewRootImpl();
+ if (viewRoot != null) {
+ viewRoot.getHandwritingInitiator().onInputConnectionCreated(view);
+ }
+ }
+
/**
* An empty method only to avoid crashes of apps that call this method via reflection and do not
* handle {@link NoSuchMethodException} in a graceful manner.
@@ -3550,6 +3572,7 @@ public final class InputMethodManager {
p.println(" mCurrentTextBoxAttribute: null");
}
p.println(" mServedInputConnection=" + mServedInputConnection);
+ p.println(" mServedInputConnectionHandler=" + mServedInputConnectionHandler);
p.println(" mCompletions=" + Arrays.toString(mCompletions));
p.println(" mCursorRect=" + mCursorRect);
p.println(" mCursorSelStart=" + mCursorSelStart
diff --git a/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java b/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java
index 12b522bb98f2..f21cee997163 100644
--- a/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java
+++ b/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java
@@ -191,7 +191,7 @@ public final class RemoteInputConnectionImpl extends IInputContext.Stub {
* @return {@link InputConnection} to which incoming IPCs will be dispatched.
*/
@Nullable
- private InputConnection getInputConnection() {
+ public InputConnection getInputConnection() {
synchronized (mLock) {
return mInputConnection;
}