diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 003c7c3c4f..17a60228f5 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -1953,20 +1953,7 @@ public class AdapterMessage extends RecyclerView.Adapter width) { - float scale = width / image.getIntrinsicWidth(); - image.setBounds(0, 0, - Math.round(image.getIntrinsicWidth() * scale), - Math.round(image.getIntrinsicHeight() * scale)); - } - - return image; + return HtmlHelper.decodeImage(context, message.id, source, show_images, tvBody); } }, null); diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 80f479a9f5..c47d7fb08e 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -94,7 +94,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; -import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.Group; import androidx.core.content.FileProvider; import androidx.cursoradapter.widget.SimpleCursorAdapter; @@ -2898,20 +2897,7 @@ public class FragmentCompose extends FragmentBase { new Html.ImageGetter() { @Override public Drawable getDrawable(String source) { - Drawable image = HtmlHelper.decodeImage(context, id, source, show_images, tvReference); - - ConstraintLayout.LayoutParams params = - (ConstraintLayout.LayoutParams) tvReference.getLayoutParams(); - float width = context.getResources().getDisplayMetrics().widthPixels - - params.leftMargin - params.rightMargin; - if (image.getIntrinsicWidth() > width) { - float scale = width / image.getIntrinsicWidth(); - image.setBounds(0, 0, - Math.round(image.getIntrinsicWidth() * scale), - Math.round(image.getIntrinsicHeight() * scale)); - } - - return image; + return HtmlHelper.decodeImage(context, id, source, show_images, tvReference); } }, null); diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index 66e5fbbc09..c3384c8be8 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -24,6 +24,7 @@ import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LevelListDrawable; @@ -32,6 +33,8 @@ import android.text.Html; import android.text.Spanned; import android.text.TextUtils; import android.util.Base64; +import android.util.DisplayMetrics; +import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; @@ -361,7 +364,10 @@ public class HtmlHelper { return d; } else { Drawable d = new BitmapDrawable(res, bm); - d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + d.setBounds(0, 0, Math.round(bm.getWidth() * dm.density), Math.round(bm.getHeight() * dm.density)); + if (view != null) + fitDrawable(d, view); return d; } } @@ -370,7 +376,10 @@ public class HtmlHelper { // Data URI if (data && (show || inline)) try { - return getDataDrawable(res, source); + Drawable d = getDataDrawable(context, source); + if (view != null) + fitDrawable(d, view); + return d; } catch (IllegalArgumentException ex) { Log.w(ex); Drawable d = res.getDrawable(R.drawable.baseline_broken_image_24, theme); @@ -393,8 +402,15 @@ public class HtmlHelper { final File file = new File(dir, id + "_" + Math.abs(source.hashCode()) + ".png"); Drawable cached = getCachedImage(context, file); - if (cached != null || view == null) + if (cached != null || view == null) { + if (view == null) { + Drawable d = res.getDrawable(R.drawable.baseline_hourglass_empty_24, theme); + d.setBounds(0, 0, px, px); + return d; + } else + fitDrawable(cached, view); return cached; + } final LevelListDrawable lld = new LevelListDrawable(); Drawable wait = res.getDrawable(R.drawable.baseline_hourglass_empty_24, theme); @@ -408,6 +424,7 @@ public class HtmlHelper { try { Drawable cached = getCachedImage(context, file); if (cached != null) { + fitDrawable(cached, view); post(cached, source); return; } @@ -447,7 +464,9 @@ public class HtmlHelper { // Create drawable from bitmap Drawable d = new BitmapDrawable(res, bm); - d.setBounds(0, 0, bm.getWidth(), bm.getHeight()); + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + d.setBounds(0, 0, Math.round(bm.getWidth() * dm.density), Math.round(bm.getHeight() * dm.density)); + fitDrawable(d, view); post(d, source); } catch (Throwable ex) { // Show broken icon @@ -463,22 +482,14 @@ public class HtmlHelper { private void post(final Drawable d, String source) { Log.i("Posting image=" + source); + new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { - int w = d.getIntrinsicWidth(); - int h = d.getIntrinsicHeight(); - - float width = view.getWidth(); - if (w > width) { - float scale = width / w; - w = Math.round(w * scale); - h = Math.round(h * scale); - d.setBounds(0, 0, w, h); - } + Rect bounds = d.getBounds(); lld.addLevel(0, 0, d); - lld.setBounds(0, 0, w, h); + lld.setBounds(0, 0, bounds.width(), bounds.height()); lld.setLevel(0); view.setText(view.getText()); @@ -490,7 +501,21 @@ public class HtmlHelper { return lld; } - private static Drawable getDataDrawable(Resources res, String source) { + private static void fitDrawable(Drawable d, View view) { + Rect bounds = d.getBounds(); + int w = bounds.width(); + int h = bounds.height(); + + float width = view.getWidth(); + if (w > width) { + float scale = width / w; + w = Math.round(w * scale); + h = Math.round(h * scale); + d.setBounds(0, 0, w, h); + } + } + + private static Drawable getDataDrawable(Context context, String source) { // "