summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mehdi Alizadeh <mett@google.com> 2020-05-04 22:15:26 -0700
committer Mehdi Alizadeh <mett@google.com> 2020-05-18 23:57:52 +0000
commit07c91a8697329e512f74abcf70d0c9fc7ac62e31 (patch)
treed57302c1b7c8115e92933dcb3b997b0a433eada7
parenta1ad29da2df4fbc76b285793a222dbfa09f8eba4 (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.java23
-rw-r--r--services/core/java/com/android/server/pm/ShortcutService.java3
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);