From 6748ff37db680fbe832a977377540e9a03a0d4c7 Mon Sep 17 00:00:00 2001 From: Mihai Popa Date: Tue, 8 May 2018 19:18:43 +0100 Subject: [PATCH] Fix crash after smart selection animation At the end of the smart selection animation, we run a callback that sets the selection on the TextView (subsequently starting the action mode toolbar and showing the handles). However, when the text changes before the animation finishes, the selection might not be valid, and might get out of the text bounds, which was producing a crash. This was observed in a monkey crash. This CL fixes this bug by refusing to set the selection when it goes outside the text bounds, corresponding to the case when text has changed between the time the animation has started and the time it ended. Bug: 69919777 Test: manual testing before and after the fix Change-Id: Iea043f320004d45ad16dd7e9e5b47e5256e6d9fa (cherry picked from commit cce6e82d35b5a6c8eb29e76fbae53eae8b70e99a) Merged-in: Iea043f320004d45ad16dd7e9e5b47e5256e6d9fa --- core/java/android/widget/SelectionActionModeHelper.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java index 1f2b90a116160..47e9b0ad1e34e 100644 --- a/core/java/android/widget/SelectionActionModeHelper.java +++ b/core/java/android/widget/SelectionActionModeHelper.java @@ -282,7 +282,12 @@ public final class SelectionActionModeHelper { @Nullable SelectionResult result) { final Layout layout = mTextView.getLayout(); - final Runnable onAnimationEndCallback = () -> startSelectionActionMode(result); + final Runnable onAnimationEndCallback = () -> { + if (result.mStart >= 0 && result.mEnd <= getText(mTextView).length() + && result.mStart <= result.mEnd) { + startSelectionActionMode(result); + } + }; // TODO do not trigger the animation if the change included only non-printable characters final boolean didSelectionChange = result != null && (mTextView.getSelectionStart() != result.mStart