[content-capture] remove span support, fix leaks
Bug: 239080094
Test: CtsContentCaptureServiceTestCases, FrameworkCoreTests
Change-Id: Ib9ec7b48e2d907af3d7a7669178ef4853dce8de9
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java
index 8cff066..efd50e7 100644
--- a/core/java/android/view/contentcapture/MainContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java
@@ -46,8 +46,6 @@
import android.os.RemoteException;
import android.text.Selection;
import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.Spanned;
import android.text.TextUtils;
import android.util.LocalLog;
import android.util.Log;
@@ -740,7 +738,10 @@
// Since the same CharSequence instance may be reused in the TextView, we need to make
// a copy of its content so that its value will not be changed by subsequent updates
// in the TextView.
- final CharSequence eventText = stringOrSpannedStringWithoutNoCopySpans(text);
+ CharSequence trimmed = TextUtils.trimToParcelableSize(text);
+ final CharSequence eventText = trimmed != null && trimmed == text
+ ? trimmed.toString()
+ : trimmed;
final int composingStart;
final int composingEnd;
@@ -761,16 +762,6 @@
.setSelectionIndex(startIndex, endIndex)));
}
- private CharSequence stringOrSpannedStringWithoutNoCopySpans(CharSequence source) {
- if (source == null) {
- return null;
- } else if (source instanceof Spanned) {
- return new SpannableString(source, /* ignoreNoCopySpan= */ true);
- } else {
- return source.toString();
- }
- }
-
/** Public because is also used by ViewRootImpl */
public void notifyViewInsetsChanged(int sessionId, @NonNull Insets viewInsets) {
mHandler.post(() -> sendEvent(new ContentCaptureEvent(sessionId, TYPE_VIEW_INSETS_CHANGED)
diff --git a/core/java/android/view/contentcapture/ViewNode.java b/core/java/android/view/contentcapture/ViewNode.java
index 1762a58..044a31f 100644
--- a/core/java/android/view/contentcapture/ViewNode.java
+++ b/core/java/android/view/contentcapture/ViewNode.java
@@ -1052,14 +1052,21 @@
}
void writeToParcel(Parcel out, boolean simple) {
- TextUtils.writeToParcel(mText, out, 0);
+ CharSequence text = TextUtils.trimToParcelableSize(mText);
+ TextUtils.writeToParcel(text, out, 0);
out.writeFloat(mTextSize);
out.writeInt(mTextStyle);
out.writeInt(mTextColor);
if (!simple) {
+ int selectionStart = text != null
+ ? Math.min(mTextSelectionStart, text.length())
+ : mTextSelectionStart;
+ int selectionEnd = text != null
+ ? Math.min(mTextSelectionEnd, text.length())
+ : mTextSelectionEnd;
out.writeInt(mTextBackgroundColor);
- out.writeInt(mTextSelectionStart);
- out.writeInt(mTextSelectionEnd);
+ out.writeInt(selectionStart);
+ out.writeInt(selectionEnd);
out.writeIntArray(mLineCharOffsets);
out.writeIntArray(mLineBaselines);
out.writeString(mHint);