summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/ShortcutPackage.java8
-rw-r--r--services/core/java/com/android/server/pm/ShortcutService.java49
2 files changed, 49 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index 890c89152a7c..fa6f4eedce7c 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -1470,9 +1470,15 @@ class ShortcutPackage extends ShortcutPackageItem {
}
// Then make sure none of the activities have more than the max number of shortcuts.
+ int total = 0;
for (int i = counts.size() - 1; i >= 0; i--) {
- service.enforceMaxActivityShortcuts(counts.valueAt(i));
+ int count = counts.valueAt(i);
+ service.enforceMaxActivityShortcuts(count);
+ total += count;
}
+
+ // Finally make sure that the app doesn't have more than the max number of shortcuts.
+ service.enforceMaxAppShortcuts(total);
}
/**
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 0b20683185f0..014a77b57446 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -181,6 +181,9 @@ public class ShortcutService extends IShortcutService.Stub {
static final int DEFAULT_MAX_SHORTCUTS_PER_ACTIVITY = 15;
@VisibleForTesting
+ static final int DEFAULT_MAX_SHORTCUTS_PER_APP = 60;
+
+ @VisibleForTesting
static final int DEFAULT_MAX_ICON_DIMENSION_DP = 96;
@VisibleForTesting
@@ -257,6 +260,11 @@ public class ShortcutService extends IShortcutService.Stub {
String KEY_MAX_SHORTCUTS = "max_shortcuts";
/**
+ * Key name for the max dynamic shortcuts per app. (int)
+ */
+ String KEY_MAX_SHORTCUTS_PER_APP = "max_shortcuts_per_app";
+
+ /**
* Key name for icon compression quality, 0-100.
*/
String KEY_ICON_QUALITY = "icon_quality";
@@ -329,9 +337,14 @@ public class ShortcutService extends IShortcutService.Stub {
new SparseArray<>();
/**
+ * Max number of dynamic + manifest shortcuts that each activity can have at a time.
+ */
+ private int mMaxShortcutsPerActivity;
+
+ /**
* Max number of dynamic + manifest shortcuts that each application can have at a time.
*/
- private int mMaxShortcuts;
+ private int mMaxShortcutsPerApp;
/**
* Max number of updating API calls that each application can make during the interval.
@@ -804,9 +817,12 @@ public class ShortcutService extends IShortcutService.Stub {
mMaxUpdatesPerInterval = Math.max(0, (int) parser.getLong(
ConfigConstants.KEY_MAX_UPDATES_PER_INTERVAL, DEFAULT_MAX_UPDATES_PER_INTERVAL));
- mMaxShortcuts = Math.max(0, (int) parser.getLong(
+ mMaxShortcutsPerActivity = Math.max(0, (int) parser.getLong(
ConfigConstants.KEY_MAX_SHORTCUTS, DEFAULT_MAX_SHORTCUTS_PER_ACTIVITY));
+ mMaxShortcutsPerApp = Math.max(0, (int) parser.getLong(
+ ConfigConstants.KEY_MAX_SHORTCUTS_PER_APP, DEFAULT_MAX_SHORTCUTS_PER_APP));
+
final int iconDimensionDp = Math.max(1, injectIsLowRamDevice()
? (int) parser.getLong(
ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM,
@@ -1746,16 +1762,33 @@ public class ShortcutService extends IShortcutService.Stub {
* {@link #getMaxActivityShortcuts()}.
*/
void enforceMaxActivityShortcuts(int numShortcuts) {
- if (numShortcuts > mMaxShortcuts) {
+ if (numShortcuts > mMaxShortcutsPerActivity) {
throw new IllegalArgumentException("Max number of dynamic shortcuts exceeded");
}
}
/**
+ * @throws IllegalArgumentException if {@code numShortcuts} is bigger than
+ * {@link #getMaxAppShortcuts()}.
+ */
+ void enforceMaxAppShortcuts(int numShortcuts) {
+ if (numShortcuts > mMaxShortcutsPerApp) {
+ throw new IllegalArgumentException("Max number of dynamic shortcuts per app exceeded");
+ }
+ }
+
+ /**
* Return the max number of dynamic + manifest shortcuts for each launcher icon.
*/
int getMaxActivityShortcuts() {
- return mMaxShortcuts;
+ return mMaxShortcutsPerActivity;
+ }
+
+ /**
+ * Return the max number of dynamic + manifest shortcuts for each launcher icon.
+ */
+ int getMaxAppShortcuts() {
+ return mMaxShortcutsPerApp;
}
/**
@@ -2188,6 +2221,8 @@ public class ShortcutService extends IShortcutService.Stub {
ps.ensureNotImmutable(shortcut.getId(), /*ignoreInvisible=*/ true);
fillInDefaultActivity(Arrays.asList(shortcut));
+ enforceMaxAppShortcuts(ps.getShortcutCount());
+
if (!shortcut.hasRank()) {
shortcut.setRank(0);
}
@@ -2575,7 +2610,7 @@ public class ShortcutService extends IShortcutService.Stub {
throws RemoteException {
verifyCaller(packageName, userId);
- return mMaxShortcuts;
+ return mMaxShortcutsPerActivity;
}
@Override
@@ -4723,7 +4758,7 @@ public class ShortcutService extends IShortcutService.Stub {
pw.print(" maxUpdatesPerInterval: ");
pw.println(mMaxUpdatesPerInterval);
pw.print(" maxShortcutsPerActivity: ");
- pw.println(mMaxShortcuts);
+ pw.println(mMaxShortcutsPerActivity);
pw.println();
mStatLogger.dump(pw, " ");
@@ -5210,7 +5245,7 @@ public class ShortcutService extends IShortcutService.Stub {
@VisibleForTesting
int getMaxShortcutsForTest() {
- return mMaxShortcuts;
+ return mMaxShortcutsPerActivity;
}
@VisibleForTesting