aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/persistance/FileBackend.java
diff options
context:
space:
mode:
authorChristian Schneppe <christian.schneppe@pix-art.de>2020-02-11 19:52:25 +0100
committerChristian Schneppe <christian.schneppe@pix-art.de>2020-02-11 19:52:25 +0100
commit71780abb89b56e976bccecea721581794df0f62b (patch)
tree8b1dd0e10c35781d23fbc44dd7da05a0e4adca1e /src/main/java/de/pixart/messenger/persistance/FileBackend.java
parent993fb18d520d629305d0c0da70acb53d6aa07c70 (diff)
rework PDF preview
should fix #456
Diffstat (limited to '')
-rw-r--r--src/main/java/de/pixart/messenger/persistance/FileBackend.java84
1 files changed, 66 insertions, 18 deletions
diff --git a/src/main/java/de/pixart/messenger/persistance/FileBackend.java b/src/main/java/de/pixart/messenger/persistance/FileBackend.java
index fb095502a..6f7ee3992 100644
--- a/src/main/java/de/pixart/messenger/persistance/FileBackend.java
+++ b/src/main/java/de/pixart/messenger/persistance/FileBackend.java
@@ -27,6 +27,7 @@ import android.system.Os;
import android.system.StructStat;
import android.util.Base64;
import android.util.Base64OutputStream;
+import android.util.DisplayMetrics;
import android.util.Log;
import android.util.LruCache;
@@ -651,10 +652,10 @@ public class FileBackend {
}
DownloadableFile file = getFile(message);
final String mime = file.getMimeType();
- if (mime.startsWith("video/")) {
- thumbnail = getVideoPreview(file, size);
- } else if ((mime.contains("pdf")) && Compatibility.runsTwentyOne()) {
+ if ("application/pdf".equals(mime) && Compatibility.runsTwentyOne()) {
thumbnail = getPDFPreview(file, size);
+ } else if (mime.startsWith("video/")) {
+ thumbnail = getVideoPreview(file, size);
} else if (mime.startsWith("image/")) {
Bitmap fullsize = getFullsizeImagePreview(file, size);
if (fullsize == null) {
@@ -676,29 +677,43 @@ public class FileBackend {
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
- private Bitmap getPDFPreview(DownloadableFile file, int size) {
+ private Bitmap getPDFPreview(final File file, int size) {
try {
- ParcelFileDescriptor mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
+ final ParcelFileDescriptor mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
if (mFileDescriptor == null) {
return null;
}
- PdfRenderer renderer = new PdfRenderer(mFileDescriptor);
- PdfRenderer.Page page = renderer.openPage(0);
- int width = page.getWidth();
- int height = page.getHeight();
- Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ final PdfRenderer renderer = new PdfRenderer(mFileDescriptor);
+ final PdfRenderer.Page page = renderer.openPage(0);
+ final Dimensions dimensions = scalePdfDimensions(new Dimensions(page.getHeight(), page.getWidth()));
+ final Bitmap bitmap = Bitmap.createBitmap(dimensions.width, dimensions.height, Bitmap.Config.ARGB_8888);
bitmap.eraseColor(Color.WHITE);
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
drawOverlay(bitmap, R.drawable.show_pdf, 0.75f);
page.close();
renderer.close();
return bitmap;
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
+ } catch (Exception e) {
e.printStackTrace();
+ final Bitmap placeholder = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
+ placeholder.eraseColor(Color.WHITE);
+ drawOverlay(placeholder, R.drawable.show_pdf, 0.75f);
+ return placeholder;
}
- return null;
+ }
+
+ private Dimensions scalePdfDimensions(final Dimensions dimensions) {
+ final DisplayMetrics displayMetrics = mXmppConnectionService.getResources().getDisplayMetrics();
+ final int target = (int) (displayMetrics.density * 288);
+ final int w, h;
+ if (dimensions.width <= dimensions.height) {
+ w = Math.max((int) (dimensions.width / ((double) dimensions.height / target)), 1);
+ h = target;
+ } else {
+ w = target;
+ h = Math.max((int) (dimensions.height / ((double) dimensions.width / target)), 1);
+ }
+ return new Dimensions(h, w);
}
private Bitmap getFullsizeImagePreview(File file, int size) {
@@ -782,8 +797,8 @@ public class FileBackend {
}
}
- private Bitmap getVideoPreview(File file, int size) throws IOException {
- MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();
+ private Bitmap getVideoPreview(final File file, final int size) {
+ final MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();
Bitmap frame;
try {
metadataRetriever.setDataSource(file.getAbsolutePath());
@@ -1169,14 +1184,22 @@ public class FileBackend {
final boolean audio = mime != null && mime.startsWith("audio/");
final boolean vcard = mime != null && mime.contains("vcard");
final boolean apk = mime != null && mime.equals("application/vnd.android.package-archive");
+ final boolean pdf = "application/pdf".equals(mime);
final StringBuilder body = new StringBuilder();
if (url != null) {
body.append(url.toString());
}
body.append('|').append(file.getSize());
- if (image || video) {
+ if (image || video || (pdf && Compatibility.runsTwentyOne())) {
try {
- Dimensions dimensions = image ? getImageDimensions(file) : getVideoDimensions(file);
+ final Dimensions dimensions;
+ if (video) {
+ dimensions = getVideoDimensions(file);
+ } else if (pdf && Compatibility.runsTwentyOne()) {
+ dimensions = getPDFDimensions(file);
+ } else {
+ dimensions = getImageDimensions(file);
+ }
if (dimensions.valid()) {
body.append('|').append(dimensions.width).append('|').append(dimensions.height);
}
@@ -1196,6 +1219,31 @@ public class FileBackend {
message.setType(privateMessage ? Message.TYPE_PRIVATE_FILE : (image ? Message.TYPE_IMAGE : Message.TYPE_FILE));
}
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ private Dimensions getPDFDimensions(final File file) {
+ final ParcelFileDescriptor fileDescriptor;
+ try {
+ fileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
+ if (fileDescriptor == null) {
+ return new Dimensions(0, 0);
+ }
+ } catch (FileNotFoundException e) {
+ return new Dimensions(0, 0);
+ }
+ try {
+ final PdfRenderer pdfRenderer = new PdfRenderer(fileDescriptor);
+ final PdfRenderer.Page page = pdfRenderer.openPage(0);
+ final int height = page.getHeight();
+ final int width = page.getWidth();
+ page.close();
+ pdfRenderer.close();
+ return scalePdfDimensions(new Dimensions(height, width));
+ } catch (IOException e) {
+ Log.d(Config.LOGTAG, "unable to get dimensions for pdf document", e);
+ return new Dimensions(0, 0);
+ }
+ }
+
public static void updateFileParams(Message message, URL url, long size) {
final StringBuilder body = new StringBuilder();
body.append(url.toString()).append('|').append(size);