summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorOli Lan <olilan@google.com>2021-02-15 16:14:15 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2021-02-15 16:14:15 +0000
commit0e588cc3224ed264de551bd8ce33e71b49c49b85 (patch)
tree7750f06af73ed0b7ab55bef98006b1e99b0ab5d5 /core/java/android
parent14e314de81d1bb4cfb8bb68e35361c34701d9941 (diff)
parent4d5c48d9880d6bb0d5c2d55a145f435d725ebbdc (diff)
Merge "Add ClipDescription method to determine if the clip is styled text." into sc-dev
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/content/ClipData.java19
-rw-r--r--core/java/android/content/ClipDescription.java23
-rw-r--r--core/java/android/widget/TextView.java14
3 files changed, 46 insertions, 10 deletions
diff --git a/core/java/android/content/ClipData.java b/core/java/android/content/ClipData.java
index 018863774184..f3ecbf6c08f3 100644
--- a/core/java/android/content/ClipData.java
+++ b/core/java/android/content/ClipData.java
@@ -740,6 +740,7 @@ public class ClipData implements Parcelable {
mIcon = null;
mItems = new ArrayList<Item>();
mItems.add(item);
+ mClipDescription.setIsStyledText(isStyledText());
}
/**
@@ -756,6 +757,7 @@ public class ClipData implements Parcelable {
mIcon = null;
mItems = new ArrayList<Item>();
mItems.add(item);
+ mClipDescription.setIsStyledText(isStyledText());
}
/**
@@ -914,6 +916,9 @@ public class ClipData implements Parcelable {
throw new NullPointerException("item is null");
}
mItems.add(item);
+ if (mItems.size() == 1) {
+ mClipDescription.setIsStyledText(isStyledText());
+ }
}
/**
@@ -1049,6 +1054,20 @@ public class ClipData implements Parcelable {
}
}
+ private boolean isStyledText() {
+ if (mItems.isEmpty()) {
+ return false;
+ }
+ final CharSequence text = mItems.get(0).getText();
+ if (text instanceof Spanned) {
+ Spanned spanned = (Spanned) text;
+ if (TextUtils.hasStyleSpan(spanned)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
@Override
public String toString() {
StringBuilder b = new StringBuilder(128);
diff --git a/core/java/android/content/ClipDescription.java b/core/java/android/content/ClipDescription.java
index e3395e20947d..d48f83223d3e 100644
--- a/core/java/android/content/ClipDescription.java
+++ b/core/java/android/content/ClipDescription.java
@@ -120,6 +120,7 @@ public class ClipDescription implements Parcelable {
private final ArrayList<String> mMimeTypes;
private PersistableBundle mExtras;
private long mTimeStamp;
+ private boolean mIsStyledText;
/**
* Create a new clip.
@@ -325,6 +326,26 @@ public class ClipDescription implements Parcelable {
}
}
+ /**
+ * Returns true if the first item of the associated {@link ClipData} contains styled text, i.e.
+ * if it contains spans such as {@link android.text.style.CharacterStyle CharacterStyle}, {@link
+ * android.text.style.ParagraphStyle ParagraphStyle}, or {@link
+ * android.text.style.UpdateAppearance UpdateAppearance}. Returns false if it does not, or if
+ * there is no associated clip data.
+ */
+ public boolean isStyledText() {
+ return mIsStyledText;
+ }
+
+ /**
+ * Sets whether the associated {@link ClipData} contains styled text in its first item. This
+ * should be called when this description is associated with clip data or when the first item
+ * is added to the associated clip data.
+ */
+ void setIsStyledText(boolean isStyledText) {
+ mIsStyledText = isStyledText;
+ }
+
@Override
public String toString() {
StringBuilder b = new StringBuilder(128);
@@ -429,6 +450,7 @@ public class ClipDescription implements Parcelable {
dest.writeStringList(mMimeTypes);
dest.writePersistableBundle(mExtras);
dest.writeLong(mTimeStamp);
+ dest.writeBoolean(mIsStyledText);
}
ClipDescription(Parcel in) {
@@ -436,6 +458,7 @@ public class ClipDescription implements Parcelable {
mMimeTypes = in.createStringArrayList();
mExtras = in.readPersistableBundle();
mTimeStamp = in.readLong();
+ mIsStyledText = in.readBoolean();
}
public static final @android.annotation.NonNull Parcelable.Creator<ClipDescription> CREATOR =
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index fe37c5350511..0f2089a5463f 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -12940,17 +12940,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return false;
}
- final ClipData clipData = getClipboardManagerForUser().getPrimaryClip();
- final ClipDescription description = clipData.getDescription();
+ final ClipDescription description =
+ getClipboardManagerForUser().getPrimaryClipDescription();
final boolean isPlainType = description.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN);
- final CharSequence text = clipData.getItemAt(0).getText();
- if (isPlainType && (text instanceof Spanned)) {
- Spanned spanned = (Spanned) text;
- if (TextUtils.hasStyleSpan(spanned)) {
- return true;
- }
- }
- return description.hasMimeType(ClipDescription.MIMETYPE_TEXT_HTML);
+ return (isPlainType && description.isStyledText())
+ || description.hasMimeType(ClipDescription.MIMETYPE_TEXT_HTML);
}
boolean canProcessText() {