From 8875da5207678f41b6ec90800d1bf2d03327bd05 Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Thu, 25 Mar 2021 17:19:30 -0400 Subject: Increase maximum allowed size for status bar icons The previous size was causing some apps to crash which otherwise worked fine. This more closely matches the hard limit in RecordingCanvas (which we need to stay below to prevent SystemUI from crashing). Fixes: 182891864 Fixes: 182232777 Bug: 169255797 Test: atest StatusBarIconViewTest Test: manual - posting notifications with different drawable sizes Change-Id: I8deacc651e05a202ec980eeb8bcdf4f92daea8eb (cherry picked from commit 5cd7976f7d2b702f803f0628f61f02491834cd41) --- .../systemui/statusbar/StatusBarIconView.java | 25 ++++++++++++++++++---- .../systemui/statusbar/StatusBarIconViewTest.java | 2 +- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 2b6a585ff1b0..0183ef83fe73 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -31,6 +31,7 @@ import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.os.Parcelable; @@ -72,8 +73,15 @@ public class StatusBarIconView extends AnimatedImageView { public static final int STATE_DOT = 1; public static final int STATE_HIDDEN = 2; - /** Maximum allowed width or height for an icon drawable */ - private static final int MAX_IMAGE_SIZE = 500; + /** + * Maximum allowed byte count for an icon bitmap + * @see android.graphics.RecordingCanvas.MAX_BITMAP_SIZE + */ + private static final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 100 MB + /** + * Maximum allowed width or height for an icon drawable, if we can't get byte count + */ + private static final int MAX_IMAGE_SIZE = 5000; private static final String TAG = "StatusBarIconView"; private static final Property ICON_APPEAR_AMOUNT @@ -332,9 +340,18 @@ public class StatusBarIconView extends AnimatedImageView { return false; } - if (drawable.getIntrinsicWidth() > MAX_IMAGE_SIZE + if (drawable instanceof BitmapDrawable && ((BitmapDrawable) drawable).getBitmap() != null) { + // If it's a bitmap we can check the size directly + int byteCount = ((BitmapDrawable) drawable).getBitmap().getByteCount(); + if (byteCount > MAX_BITMAP_SIZE) { + Log.w(TAG, "Drawable is too large (" + byteCount + " bytes) " + mIcon); + return false; + } + } else if (drawable.getIntrinsicWidth() > MAX_IMAGE_SIZE || drawable.getIntrinsicHeight() > MAX_IMAGE_SIZE) { - Log.w(TAG, "Drawable is too large " + mIcon); + // Otherwise, check dimensions + Log.w(TAG, "Drawable is too large (" + drawable.getIntrinsicWidth() + "x" + + drawable.getIntrinsicHeight() + ") " + mIcon); return false; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java index d0d2cf7a6505..64f1e1ca1bef 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java @@ -126,7 +126,7 @@ public class StatusBarIconViewTest extends SysuiTestCase { @Test public void testGiantImageNotAllowed() { - Bitmap largeBitmap = Bitmap.createBitmap(1000, 1000, Bitmap.Config.ARGB_8888); + Bitmap largeBitmap = Bitmap.createBitmap(6000, 6000, Bitmap.Config.ARGB_8888); Icon icon = Icon.createWithBitmap(largeBitmap); StatusBarIcon largeIcon = new StatusBarIcon(UserHandle.ALL, "mockPackage", icon, 0, 0, ""); -- cgit v1.2.3-59-g8ed1b