Use CharSequence instead of String in CursorAnchorInfo

This might be useful if we need to pass some spans from the
application to the input method through CursorAnchorInfo.

This change makes CursorAnchorInfo more consistent with other
input method APIs where CharSequence is preferred over String.

BUG: 15088391
Change-Id: Ie04e8a27050849fee1c93ef14b9944acc70fafe4
diff --git a/api/current.txt b/api/current.txt
index 1f1fd65..dc23a55 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -34840,7 +34840,7 @@
     ctor public CursorAnchorInfo(android.os.Parcel);
     method public int describeContents();
     method public android.graphics.RectF getCharacterRect(int);
-    method public java.lang.String getComposingText();
+    method public java.lang.CharSequence getComposingText();
     method public int getComposingTextStart();
     method public float getInsertionMarkerBaseline();
     method public float getInsertionMarkerBottom();
diff --git a/core/java/android/view/inputmethod/CursorAnchorInfo.java b/core/java/android/view/inputmethod/CursorAnchorInfo.java
index 66f5f6c..d3d5fff 100644
--- a/core/java/android/view/inputmethod/CursorAnchorInfo.java
+++ b/core/java/android/view/inputmethod/CursorAnchorInfo.java
@@ -21,6 +21,8 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.Layout;
+import android.text.SpannedString;
+import android.text.TextUtils;
 import android.view.inputmethod.SparseRectFArray.SparseRectFArrayBuilder;
 
 import java.util.Objects;
@@ -40,7 +42,7 @@
     /**
      * The text, tracked as a composing region.
      */
-    private final String mComposingText;
+    private final CharSequence mComposingText;
 
     /**
      * Horizontal position of the insertion marker, in the local coordinates that will be
@@ -88,7 +90,7 @@
         mSelectionStart = source.readInt();
         mSelectionEnd = source.readInt();
         mComposingTextStart = source.readInt();
-        mComposingText = source.readString();
+        mComposingText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
         mInsertionMarkerHorizontal = source.readFloat();
         mInsertionMarkerTop = source.readFloat();
         mInsertionMarkerBaseline = source.readFloat();
@@ -109,7 +111,7 @@
         dest.writeInt(mSelectionStart);
         dest.writeInt(mSelectionEnd);
         dest.writeInt(mComposingTextStart);
-        dest.writeString(mComposingText);
+        TextUtils.writeToParcel(mComposingText, dest, flags);
         dest.writeFloat(mInsertionMarkerHorizontal);
         dest.writeFloat(mInsertionMarkerTop);
         dest.writeFloat(mInsertionMarkerBaseline);
@@ -210,12 +212,13 @@
             if (composingText == null) {
                 mComposingText = null;
             } else {
-                mComposingText = composingText.toString();
+                // Make a snapshot of the given char sequence.
+                mComposingText = new SpannedString(composingText);
             }
             return this;
         }
         private int mComposingTextStart = -1;
-        private String mComposingText = null;
+        private CharSequence mComposingText = null;
 
         /**
          * Sets the location of the text insertion point (zero width cursor) as a rectangle in
@@ -362,7 +365,7 @@
      * Returns the entire composing text.
      * @return null if there is no composition.
      */
-    public String getComposingText() {
+    public CharSequence getComposingText() {
         return mComposingText;
     }