Search in sources :

Example 81 with SuggestionSpan

use of android.text.style.SuggestionSpan in project android_frameworks_base by ResurrectionRemix.

the class Editor method replaceWithSuggestion.

private void replaceWithSuggestion(@NonNull final SuggestionInfo suggestionInfo) {
    final SuggestionSpan targetSuggestionSpan = findEquivalentSuggestionSpan(suggestionInfo.mSuggestionSpanInfo);
    if (targetSuggestionSpan == null) {
        // Span has been removed
        return;
    }
    final Editable editable = (Editable) mTextView.getText();
    final int spanStart = editable.getSpanStart(targetSuggestionSpan);
    final int spanEnd = editable.getSpanEnd(targetSuggestionSpan);
    if (spanStart < 0 || spanEnd <= spanStart) {
        // Span has been removed
        return;
    }
    final String originalText = TextUtils.substring(editable, spanStart, spanEnd);
    // SuggestionSpans are removed by replace: save them before
    SuggestionSpan[] suggestionSpans = editable.getSpans(spanStart, spanEnd, SuggestionSpan.class);
    final int length = suggestionSpans.length;
    int[] suggestionSpansStarts = new int[length];
    int[] suggestionSpansEnds = new int[length];
    int[] suggestionSpansFlags = new int[length];
    for (int i = 0; i < length; i++) {
        final SuggestionSpan suggestionSpan = suggestionSpans[i];
        suggestionSpansStarts[i] = editable.getSpanStart(suggestionSpan);
        suggestionSpansEnds[i] = editable.getSpanEnd(suggestionSpan);
        suggestionSpansFlags[i] = editable.getSpanFlags(suggestionSpan);
        // Remove potential misspelled flags
        int suggestionSpanFlags = suggestionSpan.getFlags();
        if ((suggestionSpanFlags & SuggestionSpan.FLAG_MISSPELLED) != 0) {
            suggestionSpanFlags &= ~SuggestionSpan.FLAG_MISSPELLED;
            suggestionSpanFlags &= ~SuggestionSpan.FLAG_EASY_CORRECT;
            suggestionSpan.setFlags(suggestionSpanFlags);
        }
    }
    // Notify source IME of the suggestion pick. Do this before swapping texts.
    targetSuggestionSpan.notifySelection(mTextView.getContext(), originalText, suggestionInfo.mSuggestionIndex);
    // Swap text content between actual text and Suggestion span
    final int suggestionStart = suggestionInfo.mSuggestionStart;
    final int suggestionEnd = suggestionInfo.mSuggestionEnd;
    final String suggestion = suggestionInfo.mText.subSequence(suggestionStart, suggestionEnd).toString();
    mTextView.replaceText_internal(spanStart, spanEnd, suggestion);
    String[] suggestions = targetSuggestionSpan.getSuggestions();
    suggestions[suggestionInfo.mSuggestionIndex] = originalText;
    // Restore previous SuggestionSpans
    final int lengthDelta = suggestion.length() - (spanEnd - spanStart);
    for (int i = 0; i < length; i++) {
        // way to assign them a valid range after replacement
        if (suggestionSpansStarts[i] <= spanStart && suggestionSpansEnds[i] >= spanEnd) {
            mTextView.setSpan_internal(suggestionSpans[i], suggestionSpansStarts[i], suggestionSpansEnds[i] + lengthDelta, suggestionSpansFlags[i]);
        }
    }
    // Move cursor at the end of the replaced word
    final int newCursorPosition = spanEnd + lengthDelta;
    mTextView.setCursorPosition_internal(newCursorPosition, newCursorPosition);
}
Also used : Editable(android.text.Editable) SuggestionSpan(android.text.style.SuggestionSpan) Paint(android.graphics.Paint)

Example 82 with SuggestionSpan

use of android.text.style.SuggestionSpan in project android_frameworks_base by ResurrectionRemix.

the class Editor method findEquivalentSuggestionSpan.

@Nullable
private SuggestionSpan findEquivalentSuggestionSpan(@NonNull SuggestionSpanInfo suggestionSpanInfo) {
    final Editable editable = (Editable) mTextView.getText();
    if (editable.getSpanStart(suggestionSpanInfo.mSuggestionSpan) >= 0) {
        // Exactly same span is found.
        return suggestionSpanInfo.mSuggestionSpan;
    }
    // Suggestion span couldn't be found. Try to find a suggestion span that has the same
    // contents.
    final SuggestionSpan[] suggestionSpans = editable.getSpans(suggestionSpanInfo.mSpanStart, suggestionSpanInfo.mSpanEnd, SuggestionSpan.class);
    for (final SuggestionSpan suggestionSpan : suggestionSpans) {
        final int start = editable.getSpanStart(suggestionSpan);
        if (start != suggestionSpanInfo.mSpanStart) {
            continue;
        }
        final int end = editable.getSpanEnd(suggestionSpan);
        if (end != suggestionSpanInfo.mSpanEnd) {
            continue;
        }
        if (suggestionSpan.equals(suggestionSpanInfo.mSuggestionSpan)) {
            return suggestionSpan;
        }
    }
    return null;
}
Also used : Editable(android.text.Editable) SuggestionSpan(android.text.style.SuggestionSpan) Paint(android.graphics.Paint) Nullable(android.annotation.Nullable)

Example 83 with SuggestionSpan

use of android.text.style.SuggestionSpan in project android_frameworks_base by ResurrectionRemix.

the class Editor method isCursorInsideEasyCorrectionSpan.

/**
     * @return <code>true</code> if the cursor is inside an {@link SuggestionSpan} with
     * {@link SuggestionSpan#FLAG_EASY_CORRECT} set.
     */
private boolean isCursorInsideEasyCorrectionSpan() {
    Spannable spannable = (Spannable) mTextView.getText();
    SuggestionSpan[] suggestionSpans = spannable.getSpans(mTextView.getSelectionStart(), mTextView.getSelectionEnd(), SuggestionSpan.class);
    for (int i = 0; i < suggestionSpans.length; i++) {
        if ((suggestionSpans[i].getFlags() & SuggestionSpan.FLAG_EASY_CORRECT) != 0) {
            return true;
        }
    }
    return false;
}
Also used : SuggestionSpan(android.text.style.SuggestionSpan) Spannable(android.text.Spannable) Paint(android.graphics.Paint)

Example 84 with SuggestionSpan

use of android.text.style.SuggestionSpan in project android_frameworks_base by ResurrectionRemix.

the class SuggestionsPopupWindowTest method testTextAppearanceInSuggestionsPopup.

@SmallTest
public void testTextAppearanceInSuggestionsPopup() {
    final String text = "abc def ghi";
    final String[] singleWordCandidates = { "DEF", "Def" };
    final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), singleWordCandidates, SuggestionSpan.FLAG_MISSPELLED);
    final String[] multiWordCandidates = { "ABC DEF GHI", "Abc Def Ghi" };
    final SuggestionSpan multiWordSuggestionSpan = new SuggestionSpan(getActivity(), multiWordCandidates, SuggestionSpan.FLAG_MISSPELLED);
    final TypedArray array = getActivity().obtainStyledAttributes(com.android.internal.R.styleable.Theme);
    final int id = array.getResourceId(com.android.internal.R.styleable.Theme_textEditSuggestionHighlightStyle, 0);
    array.recycle();
    final TextAppearanceSpan expectedSpan = new TextAppearanceSpan(getActivity(), id);
    final TextPaint tmpTp = new TextPaint();
    expectedSpan.updateDrawState(tmpTp);
    final int expectedHighlightTextColor = tmpTp.getColor();
    final float expectedHighlightTextSize = tmpTp.getTextSize();
    final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
    // *XX* means that XX is highlighted.
    for (int i = 0; i < 2; i++) {
        onView(withId(R.id.textview)).perform(click());
        onView(withId(R.id.textview)).perform(replaceText(text));
        setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1);
        setSuggestionSpan(multiWordSuggestionSpan, 0, text.length());
        showSuggestionsPopup();
        assertSuggestionsPopupIsDisplayed();
        assertSuggestionsPopupContainsItem("abc DEF ghi");
        assertSuggestionsPopupContainsItem("abc Def ghi");
        assertSuggestionsPopupContainsItem("ABC DEF GHI");
        assertSuggestionsPopupContainsItem("Abc Def Ghi");
        assertSuggestionsPopupContainsItem(getActivity().getString(com.android.internal.R.string.delete));
        onSuggestionsPopup().check(new ViewAssertion() {

            @Override
            public void check(View view, NoMatchingViewException e) {
                final ListView listView = (ListView) view.findViewById(com.android.internal.R.id.suggestionContainer);
                assertNotNull(listView);
                final int childNum = listView.getChildCount();
                assertEquals(singleWordCandidates.length + multiWordCandidates.length, childNum);
                for (int j = 0; j < childNum; j++) {
                    final TextView suggestion = (TextView) listView.getChildAt(j);
                    assertNotNull(suggestion);
                    final Spanned spanned = (Spanned) suggestion.getText();
                    assertNotNull(spanned);
                    // Check that the suggestion item order is kept.
                    final String expectedText;
                    if (j < singleWordCandidates.length) {
                        expectedText = "abc " + singleWordCandidates[j] + " ghi";
                    } else {
                        expectedText = multiWordCandidates[j - singleWordCandidates.length];
                    }
                    assertEquals(expectedText, spanned.toString());
                    // Check that the text is highlighted with correct color and text size.
                    final TextAppearanceSpan[] taSpan = spanned.getSpans(text.indexOf('d'), text.indexOf('f') + 1, TextAppearanceSpan.class);
                    assertEquals(1, taSpan.length);
                    TextPaint tp = new TextPaint();
                    taSpan[0].updateDrawState(tp);
                    assertEquals(expectedHighlightTextColor, tp.getColor());
                    assertEquals(expectedHighlightTextSize, tp.getTextSize());
                    // Check the correct part of the text is highlighted.
                    final int expectedStart;
                    final int expectedEnd;
                    if (j < singleWordCandidates.length) {
                        expectedStart = text.indexOf('d');
                        expectedEnd = text.indexOf('f') + 1;
                    } else {
                        expectedStart = 0;
                        expectedEnd = text.length();
                    }
                    assertEquals(expectedStart, spanned.getSpanStart(taSpan[0]));
                    assertEquals(expectedEnd, spanned.getSpanEnd(taSpan[0]));
                }
            }
        });
        pressBack();
        onView(withId(R.id.textview)).inRoot(withDecorView(is(getActivity().getWindow().getDecorView()))).perform(clearText());
    }
}
Also used : TextAppearanceSpan(android.text.style.TextAppearanceSpan) NoMatchingViewException(android.support.test.espresso.NoMatchingViewException) View(android.view.View) Espresso.onView(android.support.test.espresso.Espresso.onView) RootMatchers.withDecorView(android.support.test.espresso.matcher.RootMatchers.withDecorView) DragHandleUtils.onHandleView(android.widget.espresso.DragHandleUtils.onHandleView) Spanned(android.text.Spanned) TextPaint(android.text.TextPaint) TextPaint(android.text.TextPaint) ViewAssertion(android.support.test.espresso.ViewAssertion) TypedArray(android.content.res.TypedArray) SuggestionSpan(android.text.style.SuggestionSpan) SmallTest(android.test.suitebuilder.annotation.SmallTest)

Example 85 with SuggestionSpan

use of android.text.style.SuggestionSpan in project android_frameworks_base by ResurrectionRemix.

the class SuggestionsPopupWindowTest method testEasyCorrect.

@SmallTest
public void testEasyCorrect() {
    final String text = "abc def ghi";
    onView(withId(R.id.textview)).perform(click());
    onView(withId(R.id.textview)).perform(replaceText(text));
    final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), new String[] { "DEF", "Def" }, SuggestionSpan.FLAG_EASY_CORRECT | SuggestionSpan.FLAG_MISSPELLED);
    setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1);
    onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.indexOf('e')));
    assertSuggestionsPopupIsDisplayed();
    assertSuggestionsPopupContainsItem("DEF");
    assertSuggestionsPopupContainsItem("Def");
    assertSuggestionsPopupContainsItem(getActivity().getString(com.android.internal.R.string.delete));
    // Select an item.
    clickSuggestionsPopupItem("DEF");
    assertSuggestionsPopupIsNotDisplayed();
    onView(withId(R.id.textview)).check(matches(withText("abc DEF ghi")));
    onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.indexOf('e')));
    assertSuggestionsPopupIsNotDisplayed();
    showSuggestionsPopup();
    assertSuggestionsPopupIsDisplayed();
    assertSuggestionsPopupContainsItem("def");
    assertSuggestionsPopupContainsItem("Def");
    assertSuggestionsPopupContainsItem(getActivity().getString(com.android.internal.R.string.delete));
}
Also used : SuggestionSpan(android.text.style.SuggestionSpan) SmallTest(android.test.suitebuilder.annotation.SmallTest)

Aggregations

SuggestionSpan (android.text.style.SuggestionSpan)114 Paint (android.graphics.Paint)43 SmallTest (android.test.suitebuilder.annotation.SmallTest)35 Spannable (android.text.Spannable)29 Spanned (android.text.Spanned)24 Editable (android.text.Editable)21 TextPaint (android.text.TextPaint)21 SpannableString (android.text.SpannableString)14 View (android.view.View)10 SpannableStringBuilder (android.text.SpannableStringBuilder)7 SpellCheckSpan (android.text.style.SpellCheckSpan)7 Nullable (android.annotation.Nullable)5 TypedArray (android.content.res.TypedArray)5 Espresso.onView (android.support.test.espresso.Espresso.onView)5 NoMatchingViewException (android.support.test.espresso.NoMatchingViewException)5 ViewAssertion (android.support.test.espresso.ViewAssertion)5 RootMatchers.withDecorView (android.support.test.espresso.matcher.RootMatchers.withDecorView)5 BackgroundColorSpan (android.text.style.BackgroundColorSpan)5 ForegroundColorSpan (android.text.style.ForegroundColorSpan)5 ImageSpan (android.text.style.ImageSpan)5