diff options
| author | 2020-05-04 22:15:26 -0700 | |
|---|---|---|
| committer | 2020-05-18 23:57:52 +0000 | |
| commit | 07c91a8697329e512f74abcf70d0c9fc7ac62e31 (patch) | |
| tree | d57302c1b7c8115e92933dcb3b997b0a433eada7 | |
| parent | a1ad29da2df4fbc76b285793a222dbfa09f8eba4 (diff) | |
Logs error when bitmap icon is used in long-lived shortcuts
Bug: 153679293
Test: Manual test and check the logs
Change-Id: I022e8eb2e7c8ff169b7f0dfe4d384161056881ab
| -rw-r--r-- | services/core/java/com/android/server/pm/ShortcutPackage.java | 23 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/ShortcutService.java | 3 |
2 files changed, 26 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index 71a4bb431985..9fec61e67dda 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -27,6 +27,7 @@ import android.content.pm.PackageInfo; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; import android.content.res.Resources; +import android.graphics.drawable.Icon; import android.os.PersistableBundle; import android.text.format.Formatter; import android.util.ArrayMap; @@ -248,6 +249,28 @@ class ShortcutPackage extends ShortcutPackageItem { } } + public void ensureNoBitmapIconIfShortcutIsLongLived(@NonNull List<ShortcutInfo> shortcuts) { + for (int i = shortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = shortcuts.get(i); + if (!si.isLongLived()) { + continue; + } + final Icon icon = si.getIcon(); + if (icon != null && icon.getType() != Icon.TYPE_BITMAP + && icon.getType() == Icon.TYPE_ADAPTIVE_BITMAP) { + continue; + } + if (icon == null && !si.hasIconFile()) { + continue; + } + + // TODO: Throw IllegalArgumentException instead. + Slog.e(TAG, "Invalid icon type in shortcut " + si.getId() + ". Bitmaps are not allowed" + + " in long-lived shortcuts. Use Resource icons, or Uri-based icons instead."); + return; // Do not spam and return early. + } + } + /** * Delete a shortcut by ID. This will *always* remove it even if it's immutable or invisible. */ diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index e4ae007dadee..89f66259ca0f 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -1849,6 +1849,7 @@ public class ShortcutService extends IShortcutService.Stub { final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId); ps.ensureImmutableShortcutsNotIncluded(newShortcuts, /*ignoreInvisible=*/ true); + ps.ensureNoBitmapIconIfShortcutIsLongLived(newShortcuts); fillInDefaultActivity(newShortcuts); @@ -1915,6 +1916,7 @@ public class ShortcutService extends IShortcutService.Stub { final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId); ps.ensureImmutableShortcutsNotIncluded(newShortcuts, /*ignoreInvisible=*/ true); + ps.ensureNoBitmapIconIfShortcutIsLongLived(newShortcuts); // For update, don't fill in the default activity. Having null activity means // "don't update the activity" here. @@ -2013,6 +2015,7 @@ public class ShortcutService extends IShortcutService.Stub { final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId); ps.ensureImmutableShortcutsNotIncluded(newShortcuts, /*ignoreInvisible=*/ true); + ps.ensureNoBitmapIconIfShortcutIsLongLived(newShortcuts); fillInDefaultActivity(newShortcuts); |