From 792d820cc9970cd08f3861e89bf5da641e55442a Mon Sep 17 00:00:00 2001 From: Abodunrinwa Toki Date: Mon, 6 Mar 2017 23:51:11 +0000 Subject: [PATCH] Prevent crashes when in insertion mode. Test: Manually tested. Automated core tests will be written in another CL. Change-Id: If07fa6a81e60de43d8be2cbcf37b355403779fb8 --- .../view/textclassifier/TextClassifierImpl.java | 2 +- .../android/widget/SelectionActionModeHelper.java | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java index 97a36fd71c0f9..536d7e0880212 100644 --- a/core/java/android/view/textclassifier/TextClassifierImpl.java +++ b/core/java/android/view/textclassifier/TextClassifierImpl.java @@ -201,7 +201,7 @@ final class TextClassifierImpl implements TextClassifier { Preconditions.checkArgument(text != null); Preconditions.checkArgument(startIndex >= 0); Preconditions.checkArgument(endIndex <= text.length()); - Preconditions.checkArgument(endIndex >= startIndex); + Preconditions.checkArgument(endIndex > startIndex); } /** diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java index 6790532996661..b75193536f322 100644 --- a/core/java/android/widget/SelectionActionModeHelper.java +++ b/core/java/android/widget/SelectionActionModeHelper.java @@ -60,14 +60,14 @@ final class SelectionActionModeHelper { mEditor = Preconditions.checkNotNull(editor); final TextView textView = mEditor.getTextView(); mTextClassificationHelper = new TextClassificationHelper( - textView.getTextClassifier(), textView.getText(), - textView.getSelectionStart(), textView.getSelectionEnd()); + textView.getTextClassifier(), textView.getText(), 0, 1); } public void startActionModeAsync() { cancelAsyncTask(); - if (isNoOpTextClassifier()) { + if (isNoOpTextClassifier() || !hasSelection()) { // No need to make an async call for a no-op TextClassifier. + // Do not call the TextClassifier if there is no selection. startActionMode(null); } else { resetTextClassificationHelper(); @@ -84,8 +84,9 @@ final class SelectionActionModeHelper { public void invalidateActionModeAsync() { cancelAsyncTask(); - if (isNoOpTextClassifier()) { + if (isNoOpTextClassifier() || !hasSelection()) { // No need to make an async call for a no-op TextClassifier. + // Do not call the TextClassifier if there is no selection. invalidateActionMode(null); } else { resetTextClassificationHelper(); @@ -126,6 +127,11 @@ final class SelectionActionModeHelper { return mEditor.getTextView().getTextClassifier() == TextClassifier.NO_OP; } + private boolean hasSelection() { + final TextView textView = mEditor.getTextView(); + return textView.getSelectionEnd() > textView.getSelectionStart(); + } + private void startActionMode(@Nullable SelectionResult result) { final TextView textView = mEditor.getTextView(); final CharSequence text = textView.getText(); @@ -311,6 +317,7 @@ final class SelectionActionModeHelper { CharSequence text, int selectionStart, int selectionEnd) { mTextClassifier = Preconditions.checkNotNull(textClassifier); mText = Preconditions.checkNotNull(text).toString(); + Preconditions.checkArgument(selectionEnd > selectionStart); mSelectionStart = selectionStart; mSelectionEnd = selectionEnd; }