Permalink
Browse files

Introduce InputConnection#getHandler().

Currently there is an internal hidden class named
ControlledInputConnectionWrapper which works as a proxy in the
application process to receive incoming binder calls from input method
and dispatch those method calls again on an appropriate thread.
Although this is a kind of implementation details, basically you can see
the same design everywhere in the Android.

Currently ControlledInputConnectionWrapper is initialized with
view.getHandler(), where the view here is the View which was used to
call View#onCreateInputConnection().  This is actually a reasonable
behavior because we have generally assumed that there the only
reasonable way to implement InputConnection is to extend
BaseInputConnection, which is designed to be able to work only on the
UI-thread associated with the target view.

However, on Android N and onward, we are going to ensure that
BaseInputConnection can be re-implemented on top of public APIs [1].
Although most of applications should not try to do that, for certain
applications such as web browsers and WebView it may make sense to let
custom InputConnection implementation run with a custom Handler so that
the application can respond to the IME without blocking the UI thread.

To do that, this CL introduces a new method
InputConnection#getHandler(), which changes nothing as long as it
returns null, but if it returns non-null Handler, InputMethodManager
will use it to initialize ControlledInputConnectionWrapper.

Note that InputConnection#getHandler() is not for IME developers.
It just returns null when called in the IME process.

 [1] See Bug 24688781 for details.

Bug: 26945674
Change-Id: Id9e579bb3e2966986cdcb1c34bc8cacfeca2e1a9
  • Loading branch information...
1 parent 2036dad commit 612cce92ad96eda1146c3abd2afa7aaa4d4f2b3f @yukawa yukawa committed Feb 12, 2016
View
@@ -44315,6 +44315,7 @@ package android.view.inputmethod {
method public int getCursorCapsMode(int);
method public android.text.Editable getEditable();
method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
+ method public android.os.Handler getHandler();
method public java.lang.CharSequence getSelectedText(int);
method public java.lang.CharSequence getTextAfterCursor(int, int);
method public java.lang.CharSequence getTextBeforeCursor(int, int);
@@ -44478,6 +44479,7 @@ package android.view.inputmethod {
method public abstract boolean finishComposingText();
method public abstract int getCursorCapsMode(int);
method public abstract android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
+ method public abstract android.os.Handler getHandler();
method public abstract java.lang.CharSequence getSelectedText(int);
method public abstract java.lang.CharSequence getTextAfterCursor(int, int);
method public abstract java.lang.CharSequence getTextBeforeCursor(int, int);
@@ -44509,6 +44511,7 @@ package android.view.inputmethod {
method public boolean finishComposingText();
method public int getCursorCapsMode(int);
method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
+ method public android.os.Handler getHandler();
method public java.lang.CharSequence getSelectedText(int);
method public java.lang.CharSequence getTextAfterCursor(int, int);
method public java.lang.CharSequence getTextBeforeCursor(int, int);
@@ -47070,6 +47070,7 @@ package android.view.inputmethod {
method public int getCursorCapsMode(int);
method public android.text.Editable getEditable();
method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
+ method public android.os.Handler getHandler();
method public java.lang.CharSequence getSelectedText(int);
method public java.lang.CharSequence getTextAfterCursor(int, int);
method public java.lang.CharSequence getTextBeforeCursor(int, int);
@@ -47233,6 +47234,7 @@ package android.view.inputmethod {
method public abstract boolean finishComposingText();
method public abstract int getCursorCapsMode(int);
method public abstract android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
+ method public abstract android.os.Handler getHandler();
method public abstract java.lang.CharSequence getSelectedText(int);
method public abstract java.lang.CharSequence getTextAfterCursor(int, int);
method public abstract java.lang.CharSequence getTextBeforeCursor(int, int);
@@ -47264,6 +47266,7 @@ package android.view.inputmethod {
method public boolean finishComposingText();
method public int getCursorCapsMode(int);
method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
+ method public android.os.Handler getHandler();
method public java.lang.CharSequence getSelectedText(int);
method public java.lang.CharSequence getTextAfterCursor(int, int);
method public java.lang.CharSequence getTextBeforeCursor(int, int);
@@ -44332,6 +44332,7 @@ package android.view.inputmethod {
method public int getCursorCapsMode(int);
method public android.text.Editable getEditable();
method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
+ method public android.os.Handler getHandler();
method public java.lang.CharSequence getSelectedText(int);
method public java.lang.CharSequence getTextAfterCursor(int, int);
method public java.lang.CharSequence getTextBeforeCursor(int, int);
@@ -44495,6 +44496,7 @@ package android.view.inputmethod {
method public abstract boolean finishComposingText();
method public abstract int getCursorCapsMode(int);
method public abstract android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
+ method public abstract android.os.Handler getHandler();
method public abstract java.lang.CharSequence getSelectedText(int);
method public abstract java.lang.CharSequence getTextAfterCursor(int, int);
method public abstract java.lang.CharSequence getTextBeforeCursor(int, int);
@@ -44526,6 +44528,7 @@ package android.view.inputmethod {
method public boolean finishComposingText();
method public int getCursorCapsMode(int);
method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
+ method public android.os.Handler getHandler();
method public java.lang.CharSequence getSelectedText(int);
method public java.lang.CharSequence getTextAfterCursor(int, int);
method public java.lang.CharSequence getTextBeforeCursor(int, int);
@@ -19,6 +19,7 @@
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
+import android.os.Handler;
import android.os.SystemClock;
import android.text.Editable;
import android.text.NoCopySpan;
@@ -602,6 +603,10 @@ public boolean requestCursorUpdates(int cursorUpdateMode) {
return false;
}
+ public Handler getHandler() {
+ return null;
+ }
+
/**
* The default implementation places the given text into the editable,
* replacing any existing composing text. The new text is marked as
@@ -17,6 +17,7 @@
package android.view.inputmethod;
import android.os.Bundle;
+import android.os.Handler;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
@@ -786,4 +787,15 @@ public ExtractedText getExtractedText(ExtractedTextRequest request,
* {@link InputMethodManager#updateCursorAnchorInfo(android.view.View, CursorAnchorInfo)}.
*/
public boolean requestCursorUpdates(int cursorUpdateMode);
+
+ /**
+ * Called by the {@link InputMethodManager} to enable application developers to specify a
+ * dedicated {@link Handler} on which incoming IPC method calls from input methods will be
+ * dispatched.
+ *
+ * <p>Note: This does nothing when called from input methods.</p>
+ *
+ * @return {@code null} to use the default {@link Handler}.
+ */
+ public Handler getHandler();
}
@@ -17,6 +17,7 @@
package android.view.inputmethod;
import android.os.Bundle;
+import android.os.Handler;
import android.view.KeyEvent;
/**
@@ -133,4 +134,8 @@ public boolean performPrivateCommand(String action, Bundle data) {
public boolean requestCursorUpdates(int cursorUpdateMode) {
return mTarget.requestCursorUpdates(cursorUpdateMode);
}
+
+ public Handler getHandler() {
+ return mTarget.getHandler();
+ }
}
@@ -1215,7 +1215,7 @@ public void run() {
if (mCurrentTextBoxAttribute == null) {
controlFlags |= CONTROL_START_INITIAL;
}
-
+
// Hook 'em up and let 'er rip.
mCurrentTextBoxAttribute = tba;
mServedConnecting = false;
@@ -1230,15 +1230,17 @@ public void run() {
mCursorCandEnd = -1;
mCursorRect.setEmpty();
mCursorAnchorInfo = null;
- servedContext = new ControlledInputConnectionWrapper(vh.getLooper(), ic, this);
+ final Handler icHandler = ic.getHandler();
+ servedContext = new ControlledInputConnectionWrapper(
+ icHandler != null ? icHandler.getLooper() : vh.getLooper(), ic, this);
} else {
servedContext = null;
}
if (mServedInputConnectionWrapper != null) {
mServedInputConnectionWrapper.deactivate();
}
mServedInputConnectionWrapper = servedContext;
-
+
try {
if (DEBUG) Log.v(TAG, "START INPUT: " + view + " ic="
+ ic + " tba=" + tba + " controlFlags=#"
@@ -28,6 +28,7 @@
import android.graphics.drawable.TransitionDrawable;
import android.os.Bundle;
import android.os.Debug;
+import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.StrictMode;
@@ -5930,6 +5931,11 @@ public boolean performPrivateCommand(String action, Bundle data) {
public boolean requestCursorUpdates(int cursorUpdateMode) {
return getTarget().requestCursorUpdates(cursorUpdateMode);
}
+
+ @Override
+ public Handler getHandler() {
+ return getTarget().getHandler();
+ }
}
/**
@@ -17,6 +17,7 @@
package com.android.internal.view;
import android.os.Bundle;
+import android.os.Handler;
import android.os.RemoteException;
import android.os.SystemClock;
import android.util.Log;
@@ -454,4 +455,9 @@ public boolean requestCursorUpdates(int cursorUpdateMode) {
}
return result;
}
+
+ public Handler getHandler() {
+ // Nothing should happen when called from input method.
+ return null;
+ }
}

0 comments on commit 612cce9

Please sign in to comment.