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

Commit 3e7495b2 authored by Michael Jurka's avatar Michael Jurka Committed by Android (Google) Code Review
Browse files

Merge "Fix crashes for images that are not PNG or JPEG" into klp-dev

parents 8ac67e62 b2552648
Loading
Loading
Loading
Loading
+32 −7
Original line number Original line Diff line number Diff line
@@ -24,6 +24,9 @@ import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory;
import android.graphics.BitmapRegionDecoder;
import android.graphics.BitmapRegionDecoder;
import android.graphics.Canvas;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.Rect;
import android.net.Uri;
import android.net.Uri;
import android.os.Build;
import android.os.Build;
@@ -53,7 +56,8 @@ class SimpleBitmapRegionDecoderWrapper implements SimpleBitmapRegionDecoder {
    private SimpleBitmapRegionDecoderWrapper(BitmapRegionDecoder decoder) {
    private SimpleBitmapRegionDecoderWrapper(BitmapRegionDecoder decoder) {
        mDecoder = decoder;
        mDecoder = decoder;
    }
    }
    public static SimpleBitmapRegionDecoderWrapper newInstance(String pathName, boolean isShareable) {
    public static SimpleBitmapRegionDecoderWrapper newInstance(
            String pathName, boolean isShareable) {
        try {
        try {
            BitmapRegionDecoder d = BitmapRegionDecoder.newInstance(pathName, isShareable);
            BitmapRegionDecoder d = BitmapRegionDecoder.newInstance(pathName, isShareable);
            if (d != null) {
            if (d != null) {
@@ -65,7 +69,8 @@ class SimpleBitmapRegionDecoderWrapper implements SimpleBitmapRegionDecoder {
        }
        }
        return null;
        return null;
    }
    }
    public static SimpleBitmapRegionDecoderWrapper newInstance(InputStream is, boolean isShareable) {
    public static SimpleBitmapRegionDecoderWrapper newInstance(
            InputStream is, boolean isShareable) {
        try {
        try {
            BitmapRegionDecoder d = BitmapRegionDecoder.newInstance(is, isShareable);
            BitmapRegionDecoder d = BitmapRegionDecoder.newInstance(is, isShareable);
            if (d != null) {
            if (d != null) {
@@ -89,8 +94,9 @@ class SimpleBitmapRegionDecoderWrapper implements SimpleBitmapRegionDecoder {
}
}


class DumbBitmapRegionDecoder implements SimpleBitmapRegionDecoder {
class DumbBitmapRegionDecoder implements SimpleBitmapRegionDecoder {
    //byte[] streamCopy;
    Bitmap mBuffer;
    Bitmap mBuffer;
    Canvas mTempCanvas;
    Paint mTempPaint;
    private DumbBitmapRegionDecoder(Bitmap b) {
    private DumbBitmapRegionDecoder(Bitmap b) {
        mBuffer = b;
        mBuffer = b;
    }
    }
@@ -115,9 +121,23 @@ class DumbBitmapRegionDecoder implements SimpleBitmapRegionDecoder {
        return mBuffer.getHeight();
        return mBuffer.getHeight();
    }
    }
    public Bitmap decodeRegion(Rect wantRegion, BitmapFactory.Options options) {
    public Bitmap decodeRegion(Rect wantRegion, BitmapFactory.Options options) {
        System.out.println("DECODING WITH SAMPLE LEVEL OF " + options.inSampleSize);
        if (mTempCanvas == null) {
        return Bitmap.createBitmap(
            mTempCanvas = new Canvas();
                mBuffer, wantRegion.left, wantRegion.top, wantRegion.width(), wantRegion.height());
            mTempPaint = new Paint();
            mTempPaint.setFilterBitmap(true);
        }
        int sampleSize = Math.max(options.inSampleSize, 1);
        Bitmap newBitmap = Bitmap.createBitmap(
                wantRegion.width() / sampleSize,
                wantRegion.height() / sampleSize,
                Bitmap.Config.ARGB_8888);
        mTempCanvas.setBitmap(newBitmap);
        mTempCanvas.save();
        mTempCanvas.scale(1f / sampleSize, 1f / sampleSize);
        mTempCanvas.drawBitmap(mBuffer, -wantRegion.left, -wantRegion.top, mTempPaint);
        mTempCanvas.restore();
        mTempCanvas.setBitmap(null);
        return newBitmap;
    }
    }
}
}


@@ -256,6 +276,7 @@ public class BitmapRegionTileSource implements TiledImageRenderer.TileSource {
                if (regionDecoder == null) {
                if (regionDecoder == null) {
                    is = regenerateInputStream();
                    is = regenerateInputStream();
                    regionDecoder = DumbBitmapRegionDecoder.newInstance(is);
                    regionDecoder = DumbBitmapRegionDecoder.newInstance(is);
                    Utils.closeSilently(is);
                }
                }
                return regionDecoder;
                return regionDecoder;
            } catch (FileNotFoundException e) {
            } catch (FileNotFoundException e) {
@@ -280,8 +301,9 @@ public class BitmapRegionTileSource implements TiledImageRenderer.TileSource {
        }
        }
        @Override
        @Override
        public boolean readExif(ExifInterface ei) {
        public boolean readExif(ExifInterface ei) {
            InputStream is = null;
            try {
            try {
                InputStream is = regenerateInputStream();
                is = regenerateInputStream();
                ei.readExif(is);
                ei.readExif(is);
                Utils.closeSilently(is);
                Utils.closeSilently(is);
                return true;
                return true;
@@ -291,6 +313,8 @@ public class BitmapRegionTileSource implements TiledImageRenderer.TileSource {
            } catch (IOException e) {
            } catch (IOException e) {
                Log.e("BitmapRegionTileSource", "Failed to load URI " + mUri, e);
                Log.e("BitmapRegionTileSource", "Failed to load URI " + mUri, e);
                return false;
                return false;
            } finally {
                Utils.closeSilently(is);
            }
            }
        }
        }
    }
    }
@@ -316,6 +340,7 @@ public class BitmapRegionTileSource implements TiledImageRenderer.TileSource {
            if (regionDecoder == null) {
            if (regionDecoder == null) {
                is = regenerateInputStream();
                is = regenerateInputStream();
                regionDecoder = DumbBitmapRegionDecoder.newInstance(is);
                regionDecoder = DumbBitmapRegionDecoder.newInstance(is);
                Utils.closeSilently(is);
            }
            }
            return regionDecoder;
            return regionDecoder;
        }
        }
+17 −11
Original line number Original line Diff line number Diff line
@@ -247,19 +247,19 @@ public class WallpaperCropActivity extends Activity {
    private static int getRotationFromExifHelper(
    private static int getRotationFromExifHelper(
            String path, Resources res, int resId, Context context, Uri uri) {
            String path, Resources res, int resId, Context context, Uri uri) {
        ExifInterface ei = new ExifInterface();
        ExifInterface ei = new ExifInterface();
        InputStream is = null;
        BufferedInputStream bis = null;
        try {
        try {
            if (path != null) {
            if (path != null) {
                ei.readExif(path);
                ei.readExif(path);
            } else if (uri != null) {
            } else if (uri != null) {
                InputStream is = context.getContentResolver().openInputStream(uri);
                is = context.getContentResolver().openInputStream(uri);
                BufferedInputStream bis = new BufferedInputStream(is);
                bis = new BufferedInputStream(is);
                ei.readExif(bis);
                ei.readExif(bis);
                bis.close();
            } else {
            } else {
                InputStream is = res.openRawResource(resId);
                is = res.openRawResource(resId);
                BufferedInputStream bis = new BufferedInputStream(is);
                bis = new BufferedInputStream(is);
                ei.readExif(bis);
                ei.readExif(bis);
                bis.close();
            }
            }
            Integer ori = ei.getTagIntValue(ExifInterface.TAG_ORIENTATION);
            Integer ori = ei.getTagIntValue(ExifInterface.TAG_ORIENTATION);
            if (ori != null) {
            if (ori != null) {
@@ -267,6 +267,9 @@ public class WallpaperCropActivity extends Activity {
            }
            }
        } catch (IOException e) {
        } catch (IOException e) {
            Log.w(LOGTAG, "Getting exif data failed", e);
            Log.w(LOGTAG, "Getting exif data failed", e);
        } finally {
            Utils.closeSilently(bis);
            Utils.closeSilently(is);
        }
        }
        return 0;
        return 0;
    }
    }
@@ -606,13 +609,13 @@ public class WallpaperCropActivity extends Activity {
                }
                }


                // See how much we're reducing the size of the image
                // See how much we're reducing the size of the image
                int scaleDownSampleSize = Math.min(roundedTrueCrop.width() / mOutWidth,
                int scaleDownSampleSize = Math.max(1, Math.min(roundedTrueCrop.width() / mOutWidth,
                        roundedTrueCrop.height() / mOutHeight);
                        roundedTrueCrop.height() / mOutHeight));

                // Attempt to open a region decoder
                // Attempt to open a region decoder
                BitmapRegionDecoder decoder = null;
                BitmapRegionDecoder decoder = null;
                InputStream is = null;
                try {
                try {
                    InputStream is = regenerateInputStream();
                    is = regenerateInputStream();
                    if (is == null) {
                    if (is == null) {
                        Log.w(LOGTAG, "cannot get input stream for uri=" + mInUri.toString());
                        Log.w(LOGTAG, "cannot get input stream for uri=" + mInUri.toString());
                        failure = true;
                        failure = true;
@@ -622,6 +625,9 @@ public class WallpaperCropActivity extends Activity {
                    Utils.closeSilently(is);
                    Utils.closeSilently(is);
                } catch (IOException e) {
                } catch (IOException e) {
                    Log.w(LOGTAG, "cannot open region decoder for file: " + mInUri.toString(), e);
                    Log.w(LOGTAG, "cannot open region decoder for file: " + mInUri.toString(), e);
                } finally {
                   Utils.closeSilently(is);
                   is = null;
                }
                }


                Bitmap crop = null;
                Bitmap crop = null;
@@ -637,7 +643,7 @@ public class WallpaperCropActivity extends Activity {


                if (crop == null) {
                if (crop == null) {
                    // BitmapRegionDecoder has failed, try to crop in-memory
                    // BitmapRegionDecoder has failed, try to crop in-memory
                    InputStream is = regenerateInputStream();
                    is = regenerateInputStream();
                    Bitmap fullSize = null;
                    Bitmap fullSize = null;
                    if (is != null) {
                    if (is != null) {
                        BitmapFactory.Options options = new BitmapFactory.Options();
                        BitmapFactory.Options options = new BitmapFactory.Options();