diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/ShortcutPackage.java | 8 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/ShortcutService.java | 49 |
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 3506fd9be15d..7fd1b24c9b6c 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -1479,9 +1479,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 62d6717e847a..7e5613fd892f 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -180,6 +180,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 @@ -254,6 +257,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"; @@ -325,9 +333,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. @@ -787,9 +800,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, @@ -1745,16 +1761,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; } /** @@ -2213,6 +2246,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); } @@ -2771,7 +2806,7 @@ public class ShortcutService extends IShortcutService.Stub { throws RemoteException { verifyCaller(packageName, userId); - return mMaxShortcuts; + return mMaxShortcutsPerActivity; } @Override @@ -4823,7 +4858,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, " "); @@ -5311,7 +5346,7 @@ public class ShortcutService extends IShortcutService.Stub { @VisibleForTesting int getMaxShortcutsForTest() { - return mMaxShortcuts; + return mMaxShortcutsPerActivity; } @VisibleForTesting |