diff --git a/core/java/android/view/inputmethod/BaseInputConnection.java b/core/java/android/view/inputmethod/BaseInputConnection.java index 37220fe6870be..c5bce28fcee13 100644 --- a/core/java/android/view/inputmethod/BaseInputConnection.java +++ b/core/java/android/view/inputmethod/BaseInputConnection.java @@ -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); diff --git a/core/java/android/view/inputmethod/InputConnection.java b/core/java/android/view/inputmethod/InputConnection.java index 34a60bbe76425..38019c9a34f8a 100644 --- a/core/java/android/view/inputmethod/InputConnection.java +++ b/core/java/android/view/inputmethod/InputConnection.java @@ -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(),