EditableInputConnection.java revision 51bf077883df4f5cc816fbfec6d19eedffc26d70
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007-2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use this file except in compliance with the License. You may obtain a copy of 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * License for the specific language governing permissions and limitations under 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Editable; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.method.KeyListener; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.BaseInputConnection; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.CompletionInfo; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.ExtractedText; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.ExtractedTextRequest; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class EditableInputConnection extends BaseInputConnection { 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG = false; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "EditableInputConnection"; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final TextView mTextView; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public EditableInputConnection(TextView textview) { 3651bf077883df4f5cc816fbfec6d19eedffc26d70Dianne Hackborn super(textview, true); 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView = textview; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Editable getEditable() { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView tv = mTextView; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tv != null) { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return tv.getEditableText(); 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean beginBatchEdit() { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView.beginBatchEdit(); 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean endBatchEdit() { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView.endBatchEdit(); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean clearMetaKeyStates(int states) { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Editable content = getEditable(); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (content == null) return false; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KeyListener kl = mTextView.getKeyListener(); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (kl != null) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kl.clearMetaKeyState(mTextView, content, states); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (AbstractMethodError e) { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is an old listener that doesn't implement the 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // new method. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean commitCompletion(CompletionInfo text) { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "commitCompletion " + text); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView.beginBatchEdit(); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView.onCommitCompletion(text); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView.endBatchEdit(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean performEditorAction(int actionCode) { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "performEditorAction " + actionCode); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView.onEditorAction(actionCode); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean performContextMenuAction(int id) { 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "performContextMenuAction " + id); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView.beginBatchEdit(); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView.onTextContextMenuItem(id); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView.endBatchEdit(); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExtractedText getExtractedText(ExtractedTextRequest request, int flags) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTextView != null) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ExtractedText et = new ExtractedText(); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTextView.extractText(request, et)) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&GET_EXTRACTED_TEXT_MONITOR) != 0) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView.setExtracting(request); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return et; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean performPrivateCommand(String action, Bundle data) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView.onPrivateIMECommand(action, data); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean commitText(CharSequence text, int newCursorPosition) { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTextView == null) { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.commitText(text, newCursorPosition); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence errorBefore = mTextView.getError(); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean success = super.commitText(text, newCursorPosition); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence errorAfter = mTextView.getError(); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (errorAfter != null && errorBefore == errorAfter) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextView.setError(null, null); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return success; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 130