Methods Summary |
---|
public boolean | beginBatchEdit()
synchronized(this) {
if (mBatchEditNesting >= 0) {
mTextView.beginBatchEdit();
mBatchEditNesting++;
return true;
}
}
return false;
|
public boolean | clearMetaKeyStates(int states)
final Editable content = getEditable();
if (content == null) return false;
KeyListener kl = mTextView.getKeyListener();
if (kl != null) {
try {
kl.clearMetaKeyState(mTextView, content, states);
} catch (AbstractMethodError e) {
// This is an old listener that doesn't implement the
// new method.
}
}
return true;
|
public boolean | commitCompletion(android.view.inputmethod.CompletionInfo text)
if (DEBUG) Log.v(TAG, "commitCompletion " + text);
mTextView.beginBatchEdit();
mTextView.onCommitCompletion(text);
mTextView.endBatchEdit();
return true;
|
public boolean | commitCorrection(android.view.inputmethod.CorrectionInfo correctionInfo)Calls the {@link TextView#onCommitCorrection} method of the associated TextView.
if (DEBUG) Log.v(TAG, "commitCorrection" + correctionInfo);
mTextView.beginBatchEdit();
mTextView.onCommitCorrection(correctionInfo);
mTextView.endBatchEdit();
return true;
|
public boolean | commitText(java.lang.CharSequence text, int newCursorPosition)
if (mTextView == null) {
return super.commitText(text, newCursorPosition);
}
if (text instanceof Spanned) {
Spanned spanned = ((Spanned) text);
SuggestionSpan[] spans = spanned.getSpans(0, text.length(), SuggestionSpan.class);
mIMM.registerSuggestionSpansForNotification(spans);
}
mTextView.resetErrorChangedFlag();
boolean success = super.commitText(text, newCursorPosition);
mTextView.hideErrorIfUnchanged();
return success;
|
public boolean | endBatchEdit()
synchronized(this) {
if (mBatchEditNesting > 0) {
// When the connection is reset by the InputMethodManager and reportFinish
// is called, some endBatchEdit calls may still be asynchronously received from the
// IME. Do not take these into account, thus ensuring that this IC's final
// contribution to mTextView's nested batch edit count is zero.
mTextView.endBatchEdit();
mBatchEditNesting--;
return true;
}
}
return false;
|
public android.text.Editable | getEditable()
TextView tv = mTextView;
if (tv != null) {
return tv.getEditableText();
}
return null;
|
public android.view.inputmethod.ExtractedText | getExtractedText(android.view.inputmethod.ExtractedTextRequest request, int flags)
if (mTextView != null) {
ExtractedText et = new ExtractedText();
if (mTextView.extractText(request, et)) {
if ((flags&GET_EXTRACTED_TEXT_MONITOR) != 0) {
mTextView.setExtracting(request);
}
return et;
}
}
return null;
|
public boolean | performContextMenuAction(int id)
if (DEBUG) Log.v(TAG, "performContextMenuAction " + id);
mTextView.beginBatchEdit();
mTextView.onTextContextMenuItem(id);
mTextView.endBatchEdit();
return true;
|
public boolean | performEditorAction(int actionCode)
if (DEBUG) Log.v(TAG, "performEditorAction " + actionCode);
mTextView.onEditorAction(actionCode);
return true;
|
public boolean | performPrivateCommand(java.lang.String action, android.os.Bundle data)
mTextView.onPrivateIMECommand(action, data);
return true;
|
protected void | reportFinish()
super.reportFinish();
synchronized(this) {
while (mBatchEditNesting > 0) {
endBatchEdit();
}
// Will prevent any further calls to begin or endBatchEdit
mBatchEditNesting = -1;
}
|
public boolean | requestCursorUpdates(int cursorUpdateMode)
if (DEBUG) Log.v(TAG, "requestUpdateCursorAnchorInfo " + cursorUpdateMode);
// It is possible that any other bit is used as a valid flag in a future release.
// We should reject the entire request in such a case.
final int KNOWN_FLAGS_MASK = InputConnection.CURSOR_UPDATE_IMMEDIATE |
InputConnection.CURSOR_UPDATE_MONITOR;
final int unknownFlags = cursorUpdateMode & ~KNOWN_FLAGS_MASK;
if (unknownFlags != 0) {
if (DEBUG) {
Log.d(TAG, "Rejecting requestUpdateCursorAnchorInfo due to unknown flags." +
" cursorUpdateMode=" + cursorUpdateMode +
" unknownFlags=" + unknownFlags);
}
return false;
}
if (mIMM == null) {
// In this case, TYPE_CURSOR_ANCHOR_INFO is not handled.
// TODO: Return some notification code rather than false to indicate method that
// CursorAnchorInfo is temporarily unavailable.
return false;
}
mIMM.setUpdateCursorAnchorInfoMode(cursorUpdateMode);
if ((cursorUpdateMode & InputConnection.CURSOR_UPDATE_IMMEDIATE) != 0) {
if (mTextView == null) {
// In this case, FLAG_CURSOR_ANCHOR_INFO_IMMEDIATE is silently ignored.
// TODO: Return some notification code for the input method that indicates
// FLAG_CURSOR_ANCHOR_INFO_IMMEDIATE is ignored.
} else if (mTextView.isInLayout()) {
// In this case, the view hierarchy is currently undergoing a layout pass.
// IMM#updateCursorAnchorInfo is supposed to be called soon after the layout
// pass is finished.
} else {
// This will schedule a layout pass of the view tree, and the layout event
// eventually triggers IMM#updateCursorAnchorInfo.
mTextView.requestLayout();
}
}
return true;
|