Export data images

This commit is contained in:
M66B 2020-05-23 18:35:31 +02:00
parent 82296dd31f
commit 09e55fdf1c
3 changed files with 49 additions and 14 deletions

View File

@ -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<AdapterMessage.ViewHold
}.execute(context, owner, args, "view:cid");
} else if ("http".equals(scheme) || "https".equals(scheme))
Helper.view(context, uri, false);
else {
else if ("data".equals(scheme)) {
new SimpleTask<File>() {
@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");

View File

@ -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) {
// "<img src=\"data:image/png;base64,iVBORw0KGgoAAA" +
// "ANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4" +
// "//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU" +
@ -514,16 +522,7 @@ class ImageHelper {
String base64 = source.substring(source.indexOf(',') + 1);
byte[] bytes = Base64.decode(base64.getBytes(), 0);
Bitmap bm = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
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));
return d;
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
private static Drawable getCachedImage(Context context, long id, String source) {
@ -652,7 +651,7 @@ class ImageHelper {
}
@NonNull
private static File getCacheFile(Context context, long id, String source) {
static File getCacheFile(Context context, long id, String source) {
File dir = new File(context.getCacheDir(), "images");
if (!dir.exists())
dir.mkdir();

View File

@ -15,4 +15,7 @@
<cache-path
name="shared"
path="shared" />
<cache-path
name="images"
path="images" />
</paths>