From ba81c269fae38ce6073bda2da3baa6d829a6b08a Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 28 Jan 2019 19:28:57 +0000 Subject: [PATCH] Scale attached images before display to save memory --- .../java/eu/faircode/email/AdapterImage.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterImage.java b/app/src/main/java/eu/faircode/email/AdapterImage.java index a7624767f2..83ad11dadb 100644 --- a/app/src/main/java/eu/faircode/email/AdapterImage.java +++ b/app/src/main/java/eu/faircode/email/AdapterImage.java @@ -23,6 +23,8 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -79,8 +81,27 @@ public class AdapterImage extends RecyclerView.Adapter private void bindTo(EntityAttachment attachment) { if (attachment.available) { - Drawable d = BitmapDrawable.createFromPath( - EntityAttachment.getFile(context, attachment.id).getAbsolutePath()); + Drawable d = null; + File file = EntityAttachment.getFile(context, attachment.id); + + if ("image/jpeg".equals(attachment.type) || "image/png".equals(attachment.type)) { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeFile(file.getAbsolutePath(), options); + + int scaleTo = context.getResources().getDisplayMetrics().widthPixels / 2; + int factor = Math.min(options.outWidth / scaleTo, options.outWidth / scaleTo); + if (factor > 1) { + options.inJustDecodeBounds = false; + options.inSampleSize = factor; + Bitmap scaled = BitmapFactory.decodeFile(file.getAbsolutePath(), options); + d = new BitmapDrawable(scaled); + } + } + + if (d == null) + d = BitmapDrawable.createFromPath(file.getAbsolutePath()); + if (d == null) image.setImageResource(R.drawable.baseline_broken_image_24); else