Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f82653b authored by Lan Wei's avatar Lan Wei
Browse files

Update the fallback logic in BaseInputConnection#getSurroundingText()

Update the implementation of BaseInputConnection#getSurroundingText()
to fallback to use previous APIs for retrieving surrounding when there's
no valid editable. This will make the API when editor provides custom
InputConnection exends from BaseInputConnection (e.g. WebView & Google
Docs).

Also, update the fallback implementation to return null instead of empty
string when getTextBeforeCursor() or getTextAfterCursor() returns null,
to make IME is able to distinguish the two cases.

Test: atest CtsInputMethodTestCases:BaseInputConnectionTest
Test: verified manually

Bug: 167947745
Bug: 181303771
Bug: 182426649

Change-Id: I70527eb954a741640b728b4b7bb6c74e0e6496b7
parent 878589db
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -608,7 +608,12 @@ public class BaseInputConnection implements InputConnection {
        Preconditions.checkArgumentNonnegative(afterLength);

        final Editable content = getEditable();
        if (content == null) return null;
        // If {@link #getEditable()} is null or {@code mEditable} is equal to {@link #getEditable()}
        // (a.k.a, a fake editable), it means we cannot get valid content from the editable, so
        // fallback to retrieve surrounding text from other APIs.
        if (content == null || mEditable == content) {
            return InputConnection.super.getSurroundingText(beforeLength, afterLength, flags);
        }

        int selStart = Selection.getSelectionStart(content);
        int selEnd = Selection.getSelectionEnd(content);
+5 −5
Original line number Diff line number Diff line
@@ -325,16 +325,16 @@ public interface InputConnection {

        CharSequence textBeforeCursor = getTextBeforeCursor(beforeLength, flags);
        if (textBeforeCursor == null) {
            textBeforeCursor = "";
            return null;
        }
        CharSequence textAfterCursor = getTextAfterCursor(afterLength, flags);
        if (textAfterCursor == null) {
            return null;
        }
        CharSequence selectedText = getSelectedText(flags);
        if (selectedText == null) {
            selectedText = "";
        }
        CharSequence textAfterCursor = getTextAfterCursor(afterLength, flags);
        if (textAfterCursor == null) {
            textAfterCursor = "";
        }
        CharSequence surroundingText =
                TextUtils.concat(textBeforeCursor, selectedText, textAfterCursor);
        return new SurroundingText(surroundingText, textBeforeCursor.length(),