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 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 |