Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6058af44 authored by Bobby Georgescu's avatar Bobby Georgescu
Browse files

Enforce bmp type in pool, handle MTP image decode failure

- GalleryBitmapPool didn't reject bitmap types other than
ARGB_8888 which could lead to problems when a different type
is used for recycling.
- BitmapFactory throws an exception rather than returning null
when image decoding fails and an existing bitmap was supplied
for recycling, even if the failure was not caused by the use
of that bitmap. When decoding things from an MTP device, we
need to handle this since unsupported formats may be returned.

Change-Id: I8cc8aa46f5a741b360e806814991f74a131e9039
parent bb746823
Loading
Loading
Loading
Loading
+21 −5
Original line number Diff line number Diff line
@@ -38,16 +38,28 @@ public class MtpBitmapFetch {

    public static Bitmap getThumbnail(MtpDevice device, MtpObjectInfo info) {
        byte[] imageBytes = device.getThumbnail(info.getObjectHandle());
        if (imageBytes == null) return null;
        if (imageBytes == null) {
            return null;
        }
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length, o);
        if (o.outWidth == 0 || o.outHeight == 0) return null;
        if (o.outWidth == 0 || o.outHeight == 0) {
            return null;
        }
        o.inBitmap = GalleryBitmapPool.getInstance().get(o.outWidth, o.outHeight);
        o.inMutable = true;
        o.inJustDecodeBounds = false;
        o.inSampleSize = 1;
        try {
            return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length, o);
        } catch (IllegalArgumentException e) {
            // BitmapFactory throws an exception rather than returning null
            // when image decoding fails and an existing bitmap was supplied
            // for recycling, even if the failure was not caused by the use
            // of that bitmap.
            return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
        }
    }

    public static BitmapWithMetadata getFullsize(MtpDevice device, MtpObjectInfo info) {
@@ -56,7 +68,9 @@ public class MtpBitmapFetch {

    public static BitmapWithMetadata getFullsize(MtpDevice device, MtpObjectInfo info, int maxSide) {
        byte[] imageBytes = device.getObject(info.getObjectHandle(), info.getCompressedSize());
        if (imageBytes == null) return null;
        if (imageBytes == null) {
            return null;
        }
        Bitmap created;
        if (maxSide > 0) {
            BitmapFactory.Options o = new BitmapFactory.Options();
@@ -76,7 +90,9 @@ public class MtpBitmapFetch {
        } else {
            created = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
        }
        if (created == null) return null;
        if (created == null) {
            return null;
        }

        return new BitmapWithMetadata(created, Exif.getOrientation(imageBytes));
    }
+1 −1
Original line number Diff line number Diff line
@@ -106,7 +106,7 @@ public class GalleryBitmapPool {
    }

    public boolean put(Bitmap b) {
        if (b == null) {
        if (b == null || b.getConfig() != Bitmap.Config.ARGB_8888) {
            return false;
        }
        SparseArrayBitmapPool pool = getPoolForDimensions(b.getWidth(), b.getHeight());