summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorJernej Virag <jernej@google.com>2022-04-07 14:56:27 +0000
committerJernej Virag <jernej@google.com>2022-04-12 10:58:33 +0000
commit3405f17fe4165744bb9b78d092cf18f7897d3f2b (patch)
treee306a3881740383bbb1175ac9354564bd39b82e1 /core/java
parent67936291f70810fd0a633552fe5793d67207b3a3 (diff)
Downscale oversized MessagingStyle avatars
Notification API downscales oversized icons in all formats except in MessagingStyle. This seems to be an oversight that can cause massive memory usage. This downscales avatars to a reasonable size if they're too big. Bug:193720474 Bug:221890932 Test: atest NotificationTest Built a test app with 4000x4000 avatar icon. Memory usage went from 250MB to ~170KB per notification. Change-Id: I35377cdb5d61ee6e23fccc2bffb5d3aec6ca2b7d
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/app/Notification.java47
1 files changed, 47 insertions, 0 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 6e1d1cd2e4c9..6bb35db6e712 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -7917,6 +7917,8 @@ public class Notification implements Parcelable
* @hide
*/
public MessagingStyle setShortcutIcon(@Nullable Icon conversationIcon) {
+ // TODO(b/228941516): This icon should be downscaled to avoid using too much memory,
+ // see reduceImageSizes.
mShortcutIcon = conversationIcon;
return this;
}
@@ -8423,6 +8425,51 @@ public class Notification implements Parcelable
return makeMessagingView(StandardTemplateParams.VIEW_TYPE_HEADS_UP);
}
+ /**
+ * @hide
+ */
+ @Override
+ public void reduceImageSizes(Context context) {
+ super.reduceImageSizes(context);
+ Resources resources = context.getResources();
+ boolean isLowRam = ActivityManager.isLowRamDeviceStatic();
+ if (mShortcutIcon != null) {
+ int maxSize = resources.getDimensionPixelSize(
+ isLowRam ? R.dimen.notification_small_icon_size_low_ram
+ : R.dimen.notification_small_icon_size);
+ mShortcutIcon.scaleDownIfNecessary(maxSize, maxSize);
+ }
+
+ int maxAvatarSize = resources.getDimensionPixelSize(
+ isLowRam ? R.dimen.notification_person_icon_max_size
+ : R.dimen.notification_person_icon_max_size_low_ram);
+ if (mUser != null && mUser.getIcon() != null) {
+ mUser.getIcon().scaleDownIfNecessary(maxAvatarSize, maxAvatarSize);
+ }
+
+ reduceMessagesIconSizes(mMessages, maxAvatarSize);
+ reduceMessagesIconSizes(mHistoricMessages, maxAvatarSize);
+ }
+
+ /**
+ * @hide
+ */
+ private static void reduceMessagesIconSizes(@Nullable List<Message> messages, int maxSize) {
+ if (messages == null) {
+ return;
+ }
+
+ for (Message message : messages) {
+ Person sender = message.mSender;
+ if (sender != null) {
+ Icon icon = sender.getIcon();
+ if (icon != null) {
+ icon.scaleDownIfNecessary(maxSize, maxSize);
+ }
+ }
+ }
+ }
+
public static final class Message {
/** @hide */
public static final String KEY_TEXT = "text";