Merge "Add support for maxlength text fields to WebViewInputConnection."
This commit is contained in:
@@ -378,6 +378,7 @@ public class WebView extends AbsoluteLayout
|
||||
private int mInputType;
|
||||
private int mImeOptions;
|
||||
private String mHint;
|
||||
private int mMaxLength;
|
||||
|
||||
public WebViewInputConnection() {
|
||||
super(WebView.this, true);
|
||||
@@ -412,13 +413,9 @@ public class WebView extends AbsoluteLayout
|
||||
Editable editable = getEditable();
|
||||
int selectionStart = Selection.getSelectionStart(editable);
|
||||
int selectionEnd = Selection.getSelectionEnd(editable);
|
||||
text = limitReplaceTextByMaxLength(text, editable.length());
|
||||
editable.replace(0, editable.length(), text);
|
||||
InputMethodManager imm = InputMethodManager.peekInstance();
|
||||
if (imm != null) {
|
||||
// Since the text has changed, do not allow the IME to replace the
|
||||
// existing text as though it were a completion.
|
||||
imm.restartInput(WebView.this);
|
||||
}
|
||||
restartInput();
|
||||
// Keep the previous selection.
|
||||
selectionStart = Math.min(selectionStart, editable.length());
|
||||
selectionEnd = Math.min(selectionEnd, editable.length());
|
||||
@@ -429,14 +426,10 @@ public class WebView extends AbsoluteLayout
|
||||
Editable editable = getEditable();
|
||||
int selectionStart = Selection.getSelectionStart(editable);
|
||||
int selectionEnd = Selection.getSelectionEnd(editable);
|
||||
text = limitReplaceTextByMaxLength(text, selectionEnd - selectionStart);
|
||||
setNewText(selectionStart, selectionEnd, text);
|
||||
editable.replace(selectionStart, selectionEnd, text);
|
||||
InputMethodManager imm = InputMethodManager.peekInstance();
|
||||
if (imm != null) {
|
||||
// Since the text has changed, do not allow the IME to replace the
|
||||
// existing text as though it were a completion.
|
||||
imm.restartInput(WebView.this);
|
||||
}
|
||||
restartInput();
|
||||
// Move caret to the end of the new text
|
||||
int newCaret = selectionStart + text.length();
|
||||
setSelection(newCaret, newCaret);
|
||||
@@ -456,8 +449,19 @@ public class WebView extends AbsoluteLayout
|
||||
end = start;
|
||||
start = temp;
|
||||
}
|
||||
setNewText(start, end, text);
|
||||
return super.setComposingText(text, newCursorPosition);
|
||||
CharSequence limitedText = limitReplaceTextByMaxLength(text, end - start);
|
||||
setNewText(start, end, limitedText);
|
||||
if (limitedText != text) {
|
||||
newCursorPosition -= text.length() - limitedText.length();
|
||||
}
|
||||
super.setComposingText(limitedText, newCursorPosition);
|
||||
if (limitedText != text) {
|
||||
restartInput();
|
||||
int lastCaret = start + limitedText.length();
|
||||
finishComposingText();
|
||||
setSelection(lastCaret, lastCaret);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -573,6 +577,7 @@ public class WebView extends AbsoluteLayout
|
||||
mHint = initData.mLabel;
|
||||
mInputType = inputType;
|
||||
mImeOptions = imeOptions;
|
||||
mMaxLength = initData.mMaxLength;
|
||||
}
|
||||
|
||||
public void setupEditorInfo(EditorInfo outAttrs) {
|
||||
@@ -660,6 +665,29 @@ public class WebView extends AbsoluteLayout
|
||||
KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
|
||||
KeyEvent.FLAG_SOFT_KEYBOARD));
|
||||
}
|
||||
|
||||
private CharSequence limitReplaceTextByMaxLength(CharSequence text,
|
||||
int numReplaced) {
|
||||
if (mMaxLength > 0) {
|
||||
Editable editable = getEditable();
|
||||
int maxReplace = mMaxLength - editable.length() + numReplaced;
|
||||
if (maxReplace < text.length()) {
|
||||
maxReplace = Math.max(maxReplace, 0);
|
||||
// New length is greater than the maximum. trim it down.
|
||||
text = text.subSequence(0, maxReplace);
|
||||
}
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
private void restartInput() {
|
||||
InputMethodManager imm = InputMethodManager.peekInstance();
|
||||
if (imm != null) {
|
||||
// Since the text has changed, do not allow the IME to replace the
|
||||
// existing text as though it were a completion.
|
||||
imm.restartInput(WebView.this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class PastePopupWindow extends PopupWindow implements OnClickListener {
|
||||
|
||||
@@ -923,13 +923,14 @@ public final class WebViewCore {
|
||||
static class TextFieldInitData {
|
||||
public TextFieldInitData(int fieldPointer,
|
||||
String text, int type, boolean isSpellCheckEnabled,
|
||||
boolean isTextFieldNext, String label) {
|
||||
boolean isTextFieldNext, String label, int maxLength) {
|
||||
mFieldPointer = fieldPointer;
|
||||
mText = text;
|
||||
mType = type;
|
||||
mIsSpellCheckEnabled = isSpellCheckEnabled;
|
||||
mIsTextFieldNext = isTextFieldNext;
|
||||
mLabel = label;
|
||||
mMaxLength = maxLength;
|
||||
}
|
||||
int mFieldPointer;
|
||||
String mText;
|
||||
@@ -937,6 +938,7 @@ public final class WebViewCore {
|
||||
boolean mIsSpellCheckEnabled;
|
||||
boolean mIsTextFieldNext;
|
||||
String mLabel;
|
||||
int mMaxLength;
|
||||
}
|
||||
|
||||
// mAction of TouchEventData can be MotionEvent.getAction() which uses the
|
||||
@@ -2826,12 +2828,13 @@ public final class WebViewCore {
|
||||
// called by JNI
|
||||
private void initEditField(int pointer, String text, int inputType,
|
||||
boolean isSpellCheckEnabled, boolean nextFieldIsText,
|
||||
String label, int start, int end, int selectionPtr) {
|
||||
String label, int start, int end, int selectionPtr, int maxLength) {
|
||||
if (mWebView == null) {
|
||||
return;
|
||||
}
|
||||
TextFieldInitData initData = new TextFieldInitData(pointer,
|
||||
text, inputType, isSpellCheckEnabled, nextFieldIsText, label);
|
||||
text, inputType, isSpellCheckEnabled, nextFieldIsText, label,
|
||||
maxLength);
|
||||
Message.obtain(mWebView.mPrivateHandler,
|
||||
WebView.INIT_EDIT_FIELD, initData).sendToTarget();
|
||||
Message.obtain(mWebView.mPrivateHandler,
|
||||
|
||||
Reference in New Issue
Block a user