Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1702)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java

Issue 699333003: Support InputMethodManager#updateCursorAnchorInfo for Android 5.0 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase before splitting this CL. Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
index 7d25e13aad60d5d020b4fe73ba5290f60e161575..8ffba16641c28681f36a54deafb7e0b930ca490d 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
@@ -16,7 +16,9 @@ import android.text.style.UnderlineSpan;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.View;
+import android.view.inputmethod.CursorAnchorInfo;
import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
@@ -24,6 +26,7 @@ import org.chromium.base.VisibleForTesting;
import org.chromium.blink_public.web.WebInputEventModifier;
import org.chromium.blink_public.web.WebInputEventType;
import org.chromium.blink_public.web.WebTextInputFlags;
+import org.chromium.content.browser.RenderCoordinates;
import org.chromium.ui.base.ime.TextInputType;
import org.chromium.ui.picker.InputDialogContainer;
@@ -110,6 +113,8 @@ public class ImeAdapter {
private int mTextInputFlags;
private String mLastComposeText;
+ private final CursorAnchorInfoController mCursorAnchorInfoController;
+
@VisibleForTesting
int mLastSyntheticKeyCode;
@@ -125,6 +130,7 @@ public class ImeAdapter {
mInputMethodManagerWrapper = wrapper;
mViewEmbedder = embedder;
mHandler = new Handler();
+ mCursorAnchorInfoController = CursorAnchorInfoController.create(wrapper);
}
/**
@@ -145,6 +151,9 @@ public class ImeAdapter {
@VisibleForTesting
public void setInputMethodManagerWrapper(InputMethodManagerWrapper immw) {
mInputMethodManagerWrapper = immw;
+ if (mCursorAnchorInfoController != null) {
+ mCursorAnchorInfoController.setInputMethodManagerWrapper(immw);
+ }
}
/**
@@ -609,10 +618,61 @@ public class ImeAdapter {
return true;
}
+ public boolean onRequestCursorUpdates(int cursorUpdateMode) {
+ if (mCursorAnchorInfoController == null) return false;
+ return mCursorAnchorInfoController.onRequestCursorUpdates(cursorUpdateMode,
+ mViewEmbedder.getAttachedView());
+ }
+
+ /**
+ * Update the parameters that are to be passed to the IME through
+ * {@link InputMethodManager#updateCursorAnchorInfo(View, CursorAnchorInfo)}.
+ * @param text Text in the focused text field.
+ * @param selectionStart Index where the text selection starts. {@code -1} if there is no
+ * selection.
+ * @param selectionEnd Index where the text selection ends. {@code -1} if there is no
+ * selection.
+ * @param compositionStart Index where the text composition starts. {@code -1} if there is no
+ * selection.
+ * @param compositionEnd Index where the text composition ends. {@code -1} if there is no
+ * selection.
+ */
+ public void updateTextAndSelection(String text, int selectionStart, int selectionEnd,
+ int compositionStart, int compositionEnd) {
+ if (mCursorAnchorInfoController == null) return;
+ mCursorAnchorInfoController.updateTextAndSelection(text, compositionStart, compositionEnd,
+ selectionStart, selectionEnd);
+ }
+
+ /**
+ * Notify the location of composing characters to the IME if it explicitly requested them.
+ * @param renderCoordinates coordinate information to convert CSS (document) coordinates to
+ * View-local Physical (screen) coordinates
+ * @param hasInsertionMarker Whether the insertion marker is visible or not.
+ * @param insertionMarkerHorizontal X coordinates of the insertion marker if it exists.
+ * Will be ignored otherwise.
+ * @param insertionMarkerTop Y coordinates of the top of the insertion marker if it exists.
+ * Will be ignored otherwise.
+ * @param insertionMarkerBottom Y coordinates of the bottom of the insertion marker if it
+ * exists. Will be ignored otherwise.
+ */
+ public void onUpdateFrameInfo(RenderCoordinates renderCoordinates, boolean hasInsertionMarker,
+ boolean isInsertionMarkerVisible, float insertionMarkerHorizontal,
+ float insertionMarkerTop, float insertionMarkerBottom) {
+ if (mCursorAnchorInfoController == null) return;
+ mCursorAnchorInfoController.onUpdateFrameInfo(renderCoordinates, hasInsertionMarker,
+ isInsertionMarkerVisible, insertionMarkerHorizontal, insertionMarkerTop,
+ insertionMarkerBottom, mViewEmbedder.getAttachedView());
+ }
+
// Calls from C++ to Java
@CalledByNative
private void focusedNodeChanged(boolean isEditable) {
+ // Update controller before the connection is restarted.
+ if (mCursorAnchorInfoController != null) {
+ mCursorAnchorInfoController.focusedNodeChanged(isEditable);
+ }
if (mInputConnection != null && isEditable) mInputConnection.restartInput();
}
@@ -642,10 +702,19 @@ public class ImeAdapter {
}
@CalledByNative
+ private void setCharacterBounds(float[] characterBounds) {
+ if (mCursorAnchorInfoController == null) return;
+ mCursorAnchorInfoController.setCompositionCharacterBounds(characterBounds);
+ }
+
+ @CalledByNative
void detach() {
mHandler.removeCallbacks(mDismissInputRunnable);
mNativeImeAdapterAndroid = 0;
mTextInputType = 0;
+ if (mCursorAnchorInfoController != null) {
+ mCursorAnchorInfoController.focusedNodeChanged(false);
+ }
}
private native boolean nativeSendSyntheticKeyEvent(long nativeImeAdapterAndroid,

Powered by Google App Engine
This is Rietveld 408576698