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 5cd7976f7d)
This commit is contained in:
Beth Thibodeau
2021-03-25 17:19:30 -04:00
parent 7e6da1776d
commit 8875da5207
2 changed files with 22 additions and 5 deletions

View File

@@ -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<StatusBarIconView, Float> 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;
}

View File

@@ -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, "");