Removes the word surrounding the cursor via InputConnection. - Android android.view.inputmethod

Android examples for android.view.inputmethod:InputConnection

Description

Removes the word surrounding the cursor via InputConnection.

Demo Code

/*/* w  w w .j  av  a 2  s  .  c om*/
 * Copyright (C) 2009 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
import android.text.TextUtils;
import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.regex.Pattern;

public class Main{
    /**
     * Removes the word surrounding the cursor. Parameters are identical to
     * getWordAtCursor.
     */
    public static void deleteWordAtCursor(InputConnection connection,
            String separators) {

        Range range = getWordRangeAtCursor(connection, separators, null);
        if (range == null)
            return;

        connection.finishComposingText();
        // Move cursor to beginning of word, to avoid crash when cursor is outside
        // of valid range after deleting text.
        int newCursor = getCursorPosition(connection) - range.charsBefore;
        connection.setSelection(newCursor, newCursor);
        connection.deleteSurroundingText(0, range.charsBefore
                + range.charsAfter);
    }
    private static Range getWordRangeAtCursor(InputConnection connection,
            String sep, Range range) {
        if (connection == null || sep == null) {
            return null;
        }
        CharSequence before = connection.getTextBeforeCursor(1000, 0);
        CharSequence after = connection.getTextAfterCursor(1000, 0);
        if (before == null || after == null) {
            return null;
        }

        // Find first word separator before the cursor
        int start = before.length();
        while (start > 0 && !isWhitespace(before.charAt(start - 1), sep))
            start--;

        // Find last word separator after the cursor
        int end = -1;
        while (++end < after.length()
                && !isWhitespace(after.charAt(end), sep))
            ;

        int cursor = getCursorPosition(connection);
        if (start >= 0 && cursor + end <= after.length() + before.length()) {
            String word = before.toString().substring(start,
                    before.length())
                    + after.toString().substring(0, end);

            Range returnRange = range != null ? range : new Range();
            returnRange.charsBefore = before.length() - start;
            returnRange.charsAfter = end;
            returnRange.word = word;
            return returnRange;
        }

        return null;
    }
    private static int getCursorPosition(InputConnection connection) {
        ExtractedText extracted = connection.getExtractedText(
                new ExtractedTextRequest(), 0);
        if (extracted == null) {
            return -1;
        }
        return extracted.startOffset + extracted.selectionStart;
    }
    private static boolean isWhitespace(int code, String whitespace) {
        return whitespace.contains(String.valueOf((char) code));
    }
}

Related Tutorials