Home | History | Annotate | Download | only in widget
      1 /*
      2  * Copyright (C) 2007-2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
      5  * use this file except in compliance with the License. You may obtain a copy of
      6  * the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     13  * License for the specific language governing permissions and limitations under
     14  * the License.
     15  */
     16 
     17 package com.android.internal.widget;
     18 
     19 import android.os.Bundle;
     20 import android.text.Editable;
     21 import android.text.Spanned;
     22 import android.text.method.KeyListener;
     23 import android.text.style.SuggestionSpan;
     24 import android.util.Log;
     25 import android.view.inputmethod.BaseInputConnection;
     26 import android.view.inputmethod.CompletionInfo;
     27 import android.view.inputmethod.CorrectionInfo;
     28 import android.view.inputmethod.ExtractedText;
     29 import android.view.inputmethod.ExtractedTextRequest;
     30 import android.widget.TextView;
     31 
     32 public class EditableInputConnection extends BaseInputConnection {
     33     private static final boolean DEBUG = false;
     34     private static final String TAG = "EditableInputConnection";
     35 
     36     private final TextView mTextView;
     37 
     38     public EditableInputConnection(TextView textview) {
     39         super(textview, true);
     40         mTextView = textview;
     41     }
     42 
     43     @Override
     44     public Editable getEditable() {
     45         TextView tv = mTextView;
     46         if (tv != null) {
     47             return tv.getEditableText();
     48         }
     49         return null;
     50     }
     51 
     52     @Override
     53     public boolean beginBatchEdit() {
     54         mTextView.beginBatchEdit();
     55         return true;
     56     }
     57 
     58     @Override
     59     public boolean endBatchEdit() {
     60         mTextView.endBatchEdit();
     61         return true;
     62     }
     63 
     64     @Override
     65     public boolean clearMetaKeyStates(int states) {
     66         final Editable content = getEditable();
     67         if (content == null) return false;
     68         KeyListener kl = mTextView.getKeyListener();
     69         if (kl != null) {
     70             try {
     71                 kl.clearMetaKeyState(mTextView, content, states);
     72             } catch (AbstractMethodError e) {
     73                 // This is an old listener that doesn't implement the
     74                 // new method.
     75             }
     76         }
     77         return true;
     78     }
     79 
     80     @Override
     81     public boolean commitCompletion(CompletionInfo text) {
     82         if (DEBUG) Log.v(TAG, "commitCompletion " + text);
     83         mTextView.beginBatchEdit();
     84         mTextView.onCommitCompletion(text);
     85         mTextView.endBatchEdit();
     86         return true;
     87     }
     88 
     89     /**
     90      * Calls the {@link TextView#onCommitCorrection} method of the associated TextView.
     91      */
     92     @Override
     93     public boolean commitCorrection(CorrectionInfo correctionInfo) {
     94         if (DEBUG) Log.v(TAG, "commitCorrection" + correctionInfo);
     95         mTextView.beginBatchEdit();
     96         mTextView.onCommitCorrection(correctionInfo);
     97         mTextView.endBatchEdit();
     98         return true;
     99     }
    100 
    101     @Override
    102     public boolean performEditorAction(int actionCode) {
    103         if (DEBUG) Log.v(TAG, "performEditorAction " + actionCode);
    104         mTextView.onEditorAction(actionCode);
    105         return true;
    106     }
    107 
    108     @Override
    109     public boolean performContextMenuAction(int id) {
    110         if (DEBUG) Log.v(TAG, "performContextMenuAction " + id);
    111         mTextView.beginBatchEdit();
    112         mTextView.onTextContextMenuItem(id);
    113         mTextView.endBatchEdit();
    114         return true;
    115     }
    116 
    117     @Override
    118     public ExtractedText getExtractedText(ExtractedTextRequest request, int flags) {
    119         if (mTextView != null) {
    120             ExtractedText et = new ExtractedText();
    121             if (mTextView.extractText(request, et)) {
    122                 if ((flags&GET_EXTRACTED_TEXT_MONITOR) != 0) {
    123                     mTextView.setExtracting(request);
    124                 }
    125                 return et;
    126             }
    127         }
    128         return null;
    129     }
    130 
    131     @Override
    132     public boolean performPrivateCommand(String action, Bundle data) {
    133         mTextView.onPrivateIMECommand(action, data);
    134         return true;
    135     }
    136 
    137     @Override
    138     public boolean commitText(CharSequence text, int newCursorPosition) {
    139         if (mTextView == null) {
    140             return super.commitText(text, newCursorPosition);
    141         }
    142         if (text instanceof Spanned) {
    143             Spanned spanned = ((Spanned) text);
    144             SuggestionSpan[] spans = spanned.getSpans(0, text.length(), SuggestionSpan.class);
    145             mIMM.registerSuggestionSpansForNotification(spans);
    146         }
    147 
    148         mTextView.resetErrorChangedFlag();
    149         boolean success = super.commitText(text, newCursorPosition);
    150         mTextView.hideErrorIfUnchanged();
    151 
    152         return success;
    153     }
    154 }
    155