diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index 84b779466dbf9..63a158b0bf40d 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -43,7 +43,7 @@ import java.util.Comparator; public class PackageItemInfo { private static final float MAX_LABEL_SIZE_PX = 500f; /** The maximum length of a safe label, in characters */ - private static final int MAX_SAFE_LABEL_LENGTH = 50000; + private static final int MAX_SAFE_LABEL_LENGTH = 1000; /** * Public name of this item. From the "android:name" attribute. @@ -131,6 +131,12 @@ public class PackageItemInfo { * item does not have a label, its name is returned. */ public CharSequence loadLabel(PackageManager pm) { + // Trims the label string to the MAX_SAFE_LABEL_LENGTH. This is to prevent that the + // system is overwhelmed by an enormous string returned by the application. + return trimToSize(loadUnsafeLabel(pm), MAX_SAFE_LABEL_LENGTH); + } + + private CharSequence loadUnsafeLabel(PackageManager pm) { if (nonLocalizedLabel != null) { return nonLocalizedLabel; } @@ -146,6 +152,15 @@ public class PackageItemInfo { return packageName; } + private CharSequence trimToSize(CharSequence label, int size) { + if (TextUtils.isEmpty(label) || label.length() <= size) return label; + if (Character.isHighSurrogate(label.charAt(size - 1)) + && Character.isLowSurrogate(label.charAt(size))) { + size = size - 1; + } + return label.subSequence(0, size); + } + /** * Same as {@link #loadLabel(PackageManager)} with the addition that * the returned label is safe for being presented in the UI since it