summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author fionaxu <fionaxu@google.com> 2016-06-02 18:49:01 -0700
committer Chen Xu <fionaxu@google.com> 2016-06-07 22:51:28 +0000
commitbe2865a60a470c6248bdd7155f79d57239baa0f1 (patch)
tree63e2b717af36df6e5a3821ff37dba9d4477e2950
parentaf0b4466ffe2ed09b288014d1d3a9ed308fe3c76 (diff)
Backport loadSafeLabel changes
Bug:23531798 Bug:28557603 Change-Id: Iee49f7c37d6a42fe74077bb15ed47919d351d172
-rw-r--r--core/java/android/content/pm/PackageItemInfo.java64
1 files changed, 62 insertions, 2 deletions
diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java
index a67326eafb0c..d862f6b6b328 100644
--- a/core/java/android/content/pm/PackageItemInfo.java
+++ b/core/java/android/content/pm/PackageItemInfo.java
@@ -16,6 +16,8 @@
package android.content.pm;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
@@ -23,7 +25,9 @@ import android.os.Bundle;
import android.os.Parcel;
import android.text.TextUtils;
import android.util.Printer;
-
+import android.text.BidiFormatter;
+import android.text.TextPaint;
+import android.text.Html;
import java.text.Collator;
import java.util.Comparator;
@@ -37,6 +41,7 @@ import java.util.Comparator;
* in the implementation of Parcelable in subclasses.
*/
public class PackageItemInfo {
+ private static final float MAX_LABEL_SIZE_PX = 500f;
/**
* Public name of this item. From the "android:name" attribute.
*/
@@ -122,7 +127,62 @@ public class PackageItemInfo {
}
return packageName;
}
-
+
+ /**
+ * Same as {@link #loadLabel(PackageManager)} with the addition that
+ * the returned label is safe for being presented in the UI since it
+ * will not contain new lines and the length will be limited to a
+ * reasonable amount. This prevents a malicious party to influence UI
+ * layout via the app label misleading the user into performing a
+ * detrimental for them action. If the label is too long it will be
+ * truncated and ellipsized at the end.
+ *
+ * @param pm A PackageManager from which the label can be loaded; usually
+ * the PackageManager from which you originally retrieved this item
+ * @return Returns a CharSequence containing the item's label. If the
+ * item does not have a label, its name is returned.
+ *
+ * @hide
+ */
+ @SystemApi
+ public @NonNull CharSequence loadSafeLabel(@NonNull PackageManager pm) {
+ // loadLabel() always returns non-null
+ String label = loadLabel(pm).toString();
+ // strip HTML tags to avoid <br> and other tags overwriting original message
+ String labelStr = Html.fromHtml(label).toString();
+
+ // If the label contains new line characters it may push the UI
+ // down to hide a part of it. Labels shouldn't have new line
+ // characters, so just truncate at the first time one is seen.
+ final int labelLength = labelStr.length();
+ int offset = 0;
+ while (offset < labelLength) {
+ final int codePoint = labelStr.codePointAt(offset);
+ final int type = Character.getType(codePoint);
+ if (type == Character.LINE_SEPARATOR
+ || type == Character.CONTROL
+ || type == Character.PARAGRAPH_SEPARATOR) {
+ labelStr = labelStr.substring(0, offset);
+ break;
+ }
+ // replace all non-break space to " " in order to be trimmed
+ if (type == Character.SPACE_SEPARATOR) {
+ labelStr = labelStr.substring(0, offset) + " " + labelStr.substring(offset +
+ Character.charCount(codePoint));
+ }
+ offset += Character.charCount(codePoint);
+ }
+
+ labelStr = labelStr.trim();
+ if (labelStr.isEmpty()) {
+ return packageName;
+ }
+ TextPaint paint = new TextPaint();
+ paint.setTextSize(42);
+
+ return TextUtils.ellipsize(labelStr, paint, MAX_LABEL_SIZE_PX,
+ TextUtils.TruncateAt.END);
+ }
/**
* Retrieve the current graphical icon associated with this item. This
* will call back on the given PackageManager to load the icon from