From 09e55fdf1cd4541ee86885afcf773f6077b3c868 Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 23 May 2020 18:35:31 +0200 Subject: [PATCH] Export data images --- .../eu/faircode/email/AdapterMessage.java | 35 ++++++++++++++++++- .../java/eu/faircode/email/ImageHelper.java | 25 +++++++------ app/src/main/res/xml/fileprovider_paths.xml | 3 ++ 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 2a3f39ac63..2befe9b1a0 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -39,6 +39,7 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.ColorStateList; import android.database.Cursor; +import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; @@ -144,8 +145,11 @@ import com.google.android.material.snackbar.Snackbar; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; +import java.io.BufferedOutputStream; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; @@ -3887,7 +3891,36 @@ public class AdapterMessage extends RecyclerView.Adapter() { + @Override + protected File onExecute(Context context, Bundle args) throws IOException { + long id = args.getLong("id"); + String source = args.getString("source"); + + Bitmap bm = ImageHelper.getDataBitmap(source); + if (bm == null) + return null; + + File file = ImageHelper.getCacheFile(context, id, source); + try (OutputStream os = new BufferedOutputStream(new FileOutputStream(file))) { + bm.compress(Bitmap.CompressFormat.PNG, 90, os); + } + + return file; + } + + @Override + protected void onExecuted(Bundle args, File file) { + Helper.share(context, file, "image/png", file.getName()); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(parentFragment.getParentFragmentManager(), ex); + } + }.execute(context, owner, args, "view:cid"); + } else { FragmentDialogImage fragment = new FragmentDialogImage(); fragment.setArguments(args); fragment.show(parentFragment.getParentFragmentManager(), "view:image"); diff --git a/app/src/main/java/eu/faircode/email/ImageHelper.java b/app/src/main/java/eu/faircode/email/ImageHelper.java index 27db5c17ad..3f852fc4fe 100644 --- a/app/src/main/java/eu/faircode/email/ImageHelper.java +++ b/app/src/main/java/eu/faircode/email/ImageHelper.java @@ -302,7 +302,15 @@ class ImageHelper { // Data URI if (data && (show || inline || a.tracking)) try { - Drawable d = getDataDrawable(context, a.source); + Bitmap bm = getDataBitmap(source); + if (bm == null) + throw new IllegalArgumentException("decode byte array failed"); + + Drawable d = new BitmapDrawable(context.getResources(), bm); + + 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, a, view); return d; @@ -505,7 +513,7 @@ class ImageHelper { } } - private static Drawable getDataDrawable(Context context, String source) { + static Bitmap getDataBitmap(String source) { // " +