diff options
| -rw-r--r-- | api/current.txt | 12 | ||||
| -rw-r--r-- | core/java/android/view/inputmethod/BaseInputConnection.java | 12 | ||||
| -rw-r--r-- | core/java/android/view/inputmethod/InputConnection.java | 18 | ||||
| -rw-r--r-- | core/java/android/view/inputmethod/InputConnectionWrapper.java | 16 | ||||
| -rw-r--r-- | core/java/com/android/internal/view/InputConnectionWrapper.java | 23 | ||||
| -rw-r--r-- | non-updatable-api/current.txt | 12 |
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); |