summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorfionaxu <fionaxu@google.com>2016-06-07 18:57:12 -0700
committerfionaxu <fionaxu@google.com>2016-06-07 22:01:19 -0700
commitc196526f8e33b745b8d515df46b003ef44114135 (patch)
tree46af9436e05858f7d94a060e150d994da621991b /core/java
parent42a59833648243a8ac3aec7adf7f4ca0d3babdd1 (diff)
parent2c53526b4b2d89d453ecf89548ed94427424d1ec (diff)
resolve merge conflicts of 2c53526 to lmp-mr1-dev
Change-Id: I4fe45fae0a98934ac9b0f6f48c8cab8546392641
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/content/pm/PackageItemInfo.java62
1 files changed, 61 insertions, 1 deletions
diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java
index 22a899cda05b..0d089d0613e7 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;
@@ -24,7 +26,9 @@ import android.os.Parcel;
import android.os.UserHandle;
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;
@@ -38,6 +42,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.
*/
@@ -138,7 +143,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