summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt12
-rw-r--r--core/java/android/view/inputmethod/BaseInputConnection.java12
-rw-r--r--core/java/android/view/inputmethod/InputConnection.java18
-rw-r--r--core/java/android/view/inputmethod/InputConnectionWrapper.java16
-rw-r--r--core/java/com/android/internal/view/InputConnectionWrapper.java23
-rw-r--r--non-updatable-api/current.txt12
6 files changed, 67 insertions, 26 deletions
diff --git a/api/current.txt b/api/current.txt
index 11d445fb6bab..9ff7cc255bf4 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -57228,8 +57228,8 @@ package android.view.inputmethod {
method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
method public android.os.Handler getHandler();
method public CharSequence getSelectedText(int);
- method public CharSequence getTextAfterCursor(int, int);
- method public CharSequence getTextBeforeCursor(int, int);
+ method @Nullable public CharSequence getTextAfterCursor(@IntRange(from=0) int, int);
+ method @Nullable public CharSequence getTextBeforeCursor(@IntRange(from=0) int, int);
method public boolean performContextMenuAction(int);
method public boolean performEditorAction(int);
method public boolean performPrivateCommand(String, android.os.Bundle);
@@ -57455,8 +57455,8 @@ package android.view.inputmethod {
method public android.os.Handler getHandler();
method public CharSequence getSelectedText(int);
method @Nullable public default android.view.inputmethod.SurroundingText getSurroundingText(@IntRange(from=0) int, @IntRange(from=0) int, int);
- method public CharSequence getTextAfterCursor(int, int);
- method public CharSequence getTextBeforeCursor(int, int);
+ method @Nullable public CharSequence getTextAfterCursor(@IntRange(from=0) int, int);
+ method @Nullable public CharSequence getTextBeforeCursor(@IntRange(from=0) int, int);
method public boolean performContextMenuAction(int);
method public boolean performEditorAction(int);
method public boolean performPrivateCommand(String, android.os.Bundle);
@@ -57490,8 +57490,8 @@ package android.view.inputmethod {
method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
method public android.os.Handler getHandler();
method public CharSequence getSelectedText(int);
- method public CharSequence getTextAfterCursor(int, int);
- method public CharSequence getTextBeforeCursor(int, int);
+ method @Nullable public CharSequence getTextAfterCursor(@IntRange(from=0) int, int);
+ method @Nullable public CharSequence getTextBeforeCursor(@IntRange(from=0) int, int);
method public boolean performContextMenuAction(int);
method public boolean performEditorAction(int);
method public boolean performPrivateCommand(String, android.os.Bundle);
diff --git a/core/java/android/view/inputmethod/BaseInputConnection.java b/core/java/android/view/inputmethod/BaseInputConnection.java
index 093dfb4e196e..62b1b1f8cf53 100644
--- a/core/java/android/view/inputmethod/BaseInputConnection.java
+++ b/core/java/android/view/inputmethod/BaseInputConnection.java
@@ -502,7 +502,10 @@ public class BaseInputConnection implements InputConnection {
* The default implementation returns the given amount of text from the
* current cursor position in the buffer.
*/
- public CharSequence getTextBeforeCursor(int length, int flags) {
+ @Nullable
+ public CharSequence getTextBeforeCursor(@IntRange(from = 0) int length, int flags) {
+ if (length < 0) return null;
+
final Editable content = getEditable();
if (content == null) return null;
@@ -558,7 +561,10 @@ public class BaseInputConnection implements InputConnection {
* The default implementation returns the given amount of text from the
* current cursor position in the buffer.
*/
- public CharSequence getTextAfterCursor(int length, int flags) {
+ @Nullable
+ public CharSequence getTextAfterCursor(@IntRange(from = 0) int length, int flags) {
+ if (length < 0) return null;
+
final Editable content = getEditable();
if (content == null) return null;
@@ -594,6 +600,8 @@ public class BaseInputConnection implements InputConnection {
@Nullable
public SurroundingText getSurroundingText(
@IntRange(from = 0) int beforeLength, @IntRange(from = 0) int afterLength, int flags) {
+ if (beforeLength < 0 || afterLength < 0) return null;
+
final Editable content = getEditable();
if (content == null) return null;
diff --git a/core/java/android/view/inputmethod/InputConnection.java b/core/java/android/view/inputmethod/InputConnection.java
index c7acd298cd20..0fe47b7828d9 100644
--- a/core/java/android/view/inputmethod/InputConnection.java
+++ b/core/java/android/view/inputmethod/InputConnection.java
@@ -27,6 +27,8 @@ import android.text.TextUtils;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
+import com.android.internal.util.Preconditions;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -186,13 +188,15 @@ public interface InputConnection {
* the current line, and specifically do not return 0 characters unless
* the cursor is really at the start of the text.</p>
*
- * @param n The expected length of the text.
+ * @param n The expected length of the text. This must be non-negative.
* @param flags Supplies additional options controlling how the text is
* returned. May be either 0 or {@link #GET_TEXT_WITH_STYLES}.
* @return the text before the cursor position; the length of the
* returned text might be less than <var>n</var>.
+ * @throws IllegalArgumentException if {@code n} is negative.
*/
- CharSequence getTextBeforeCursor(int n, int flags);
+ @Nullable
+ CharSequence getTextBeforeCursor(@IntRange(from = 0) int n, int flags);
/**
* Get <var>n</var> characters of text after the current cursor
@@ -228,14 +232,16 @@ public interface InputConnection {
* the current line, and specifically do not return 0 characters unless
* the cursor is really at the end of the text.</p>
*
- * @param n The expected length of the text.
+ * @param n The expected length of the text. This must be non-negative.
* @param flags Supplies additional options controlling how the text is
* returned. May be either 0 or {@link #GET_TEXT_WITH_STYLES}.
*
* @return the text after the cursor position; the length of the
* returned text might be less than <var>n</var>.
+ * @throws IllegalArgumentException if {@code n} is negative.
*/
- CharSequence getTextAfterCursor(int n, int flags);
+ @Nullable
+ CharSequence getTextAfterCursor(@IntRange(from = 0) int n, int flags);
/**
* Gets the selected text, if any.
@@ -307,11 +313,15 @@ public interface InputConnection {
* editor can't comply with the request for some reason, or the application does not implement
* this method. The length of the returned text might be less than the sum of
* <var>beforeLength</var> and <var>afterLength</var> .
+ * @throws IllegalArgumentException if {@code beforeLength} or {@code afterLength} is negative.
*/
@Nullable
default SurroundingText getSurroundingText(
@IntRange(from = 0) int beforeLength, @IntRange(from = 0) int afterLength,
@GetTextType int flags) {
+ Preconditions.checkArgumentNonnegative(beforeLength);
+ Preconditions.checkArgumentNonnegative(afterLength);
+
CharSequence textBeforeCursor = getTextBeforeCursor(beforeLength, flags);
if (textBeforeCursor == null) {
textBeforeCursor = "";
diff --git a/core/java/android/view/inputmethod/InputConnectionWrapper.java b/core/java/android/view/inputmethod/InputConnectionWrapper.java
index ec7fa60a62ba..77956d15e399 100644
--- a/core/java/android/view/inputmethod/InputConnectionWrapper.java
+++ b/core/java/android/view/inputmethod/InputConnectionWrapper.java
@@ -16,11 +16,14 @@
package android.view.inputmethod;
+import android.annotation.IntRange;
import android.annotation.Nullable;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
+import com.android.internal.util.Preconditions;
+
/**
* <p>Wrapper class for proxying calls to another InputConnection. Subclass and have fun!
*/
@@ -74,18 +77,24 @@ public class InputConnectionWrapper implements InputConnection {
/**
* {@inheritDoc}
* @throws NullPointerException if the target is {@code null}.
+ * @throws IllegalArgumentException if {@code length} is negative.
*/
+ @Nullable
@Override
- public CharSequence getTextBeforeCursor(int n, int flags) {
+ public CharSequence getTextBeforeCursor(@IntRange(from = 0) int n, int flags) {
+ Preconditions.checkArgumentNonnegative(n);
return mTarget.getTextBeforeCursor(n, flags);
}
/**
* {@inheritDoc}
* @throws NullPointerException if the target is {@code null}.
+ * @throws IllegalArgumentException if {@code length} is negative.
*/
+ @Nullable
@Override
- public CharSequence getTextAfterCursor(int n, int flags) {
+ public CharSequence getTextAfterCursor(@IntRange(from = 0) int n, int flags) {
+ Preconditions.checkArgumentNonnegative(n);
return mTarget.getTextAfterCursor(n, flags);
}
@@ -101,10 +110,13 @@ public class InputConnectionWrapper implements InputConnection {
/**
* {@inheritDoc}
* @throws NullPointerException if the target is {@code null}.
+ * @throws IllegalArgumentException if {@code beforeLength} or {@code afterLength} is negative.
*/
@Nullable
@Override
public SurroundingText getSurroundingText(int beforeLength, int afterLength, int flags) {
+ Preconditions.checkArgumentNonnegative(beforeLength);
+ Preconditions.checkArgumentNonnegative(afterLength);
return mTarget.getSurroundingText(beforeLength, afterLength, flags);
}
diff --git a/core/java/com/android/internal/view/InputConnectionWrapper.java b/core/java/com/android/internal/view/InputConnectionWrapper.java
index f086dd79758b..e05aa8351681 100644
--- a/core/java/com/android/internal/view/InputConnectionWrapper.java
+++ b/core/java/com/android/internal/view/InputConnectionWrapper.java
@@ -17,6 +17,7 @@
package com.android.internal.view;
import android.annotation.AnyThread;
+import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.inputmethodservice.AbstractInputMethodService;
@@ -106,9 +107,13 @@ public class InputConnectionWrapper implements InputConnection {
return null;
}
+ /**
+ * See {@link InputConnection#getTextAfterCursor(int, int)}.
+ */
+ @Nullable
@AnyThread
- public CharSequence getTextAfterCursor(int length, int flags) {
- if (mCancellationGroup.isCanceled()) {
+ public CharSequence getTextAfterCursor(@IntRange(from = 0) int length, int flags) {
+ if (length < 0 || mCancellationGroup.isCanceled()) {
return null;
}
@@ -122,9 +127,13 @@ public class InputConnectionWrapper implements InputConnection {
return getResultOrNull(value, "getTextAfterCursor()");
}
+ /**
+ * See {@link InputConnection#getTextBeforeCursor(int, int)}.
+ */
+ @Nullable
@AnyThread
- public CharSequence getTextBeforeCursor(int length, int flags) {
- if (mCancellationGroup.isCanceled()) {
+ public CharSequence getTextBeforeCursor(@IntRange(from = 0) int length, int flags) {
+ if (length < 0 || mCancellationGroup.isCanceled()) {
return null;
}
@@ -171,10 +180,12 @@ public class InputConnectionWrapper implements InputConnection {
* not support this protocol.
*/
@AnyThread
- public SurroundingText getSurroundingText(int beforeLength, int afterLength, int flags) {
- if (mCancellationGroup.isCanceled()) {
+ public SurroundingText getSurroundingText(
+ @IntRange(from = 0) int beforeLength, @IntRange(from = 0) int afterLength, int flags) {
+ if (beforeLength < 0 || afterLength < 0 || mCancellationGroup.isCanceled()) {
return null;
}
+
if (isMethodMissing(MissingMethodFlags.GET_SURROUNDING_TEXT)) {
// This method is not implemented.
return null;
diff --git a/non-updatable-api/current.txt b/non-updatable-api/current.txt
index ff2e1d490c2e..16a5f5e82f21 100644
--- a/non-updatable-api/current.txt
+++ b/non-updatable-api/current.txt
@@ -55346,8 +55346,8 @@ package android.view.inputmethod {
method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
method public android.os.Handler getHandler();
method public CharSequence getSelectedText(int);
- method public CharSequence getTextAfterCursor(int, int);
- method public CharSequence getTextBeforeCursor(int, int);
+ method @Nullable public CharSequence getTextAfterCursor(@IntRange(from=0) int, int);
+ method @Nullable public CharSequence getTextBeforeCursor(@IntRange(from=0) int, int);
method public boolean performContextMenuAction(int);
method public boolean performEditorAction(int);
method public boolean performPrivateCommand(String, android.os.Bundle);
@@ -55573,8 +55573,8 @@ package android.view.inputmethod {
method public android.os.Handler getHandler();
method public CharSequence getSelectedText(int);
method @Nullable public default android.view.inputmethod.SurroundingText getSurroundingText(@IntRange(from=0) int, @IntRange(from=0) int, int);
- method public CharSequence getTextAfterCursor(int, int);
- method public CharSequence getTextBeforeCursor(int, int);
+ method @Nullable public CharSequence getTextAfterCursor(@IntRange(from=0) int, int);
+ method @Nullable public CharSequence getTextBeforeCursor(@IntRange(from=0) int, int);
method public boolean performContextMenuAction(int);
method public boolean performEditorAction(int);
method public boolean performPrivateCommand(String, android.os.Bundle);
@@ -55608,8 +55608,8 @@ package android.view.inputmethod {
method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
method public android.os.Handler getHandler();
method public CharSequence getSelectedText(int);
- method public CharSequence getTextAfterCursor(int, int);
- method public CharSequence getTextBeforeCursor(int, int);
+ method @Nullable public CharSequence getTextAfterCursor(@IntRange(from=0) int, int);
+ method @Nullable public CharSequence getTextBeforeCursor(@IntRange(from=0) int, int);
method public boolean performContextMenuAction(int);
method public boolean performEditorAction(int);
method public boolean performPrivateCommand(String, android.os.Bundle);