OSDN Git Service

Handle undo in TextView fields with no cursor
authorJames Cook <jamescook@google.com>
Tue, 10 Mar 2015 16:48:11 +0000 (09:48 -0700)
committerJames Cook <jamescook@google.com>
Tue, 10 Mar 2015 17:25:26 +0000 (10:25 -0700)
This fixes a rare crash in the undo system. In particular, if the
TextView did not have a cursor and the first operation was a
programmatic insert/append the "old cursor position" would be -1.
Attempting to undo would try to restore the cursor to -1 and crash.

Test will land separately in CTS.

Bug: 19332904
Change-Id: I9aa18c1e3621b99d13ac707e483154382effb81c

core/java/android/widget/Editor.java

index 0f99e88..cc44577 100644 (file)
@@ -4887,9 +4887,10 @@ public class Editor {
                     text.insert(newTextInsertAt, newText);
                 }
             }
-            // Restore the cursor position.
+            // Restore the cursor position. If there wasn't an old cursor (newCursorPos == -1) then
+            // don't explicitly set it and rely on SpannableStringBuilder to position it.
             // TODO: Select all the text that was undone.
-            if (newCursorPos <= text.length()) {
+            if (0 <= newCursorPos && newCursorPos <= text.length()) {
                 Selection.setSelection(text, newCursorPos);
             }
         }