diff options
author | Christian Schneppe <christian.schneppe@pix-art.de> | 2020-02-11 19:52:25 +0100 |
---|---|---|
committer | Christian Schneppe <christian.schneppe@pix-art.de> | 2020-02-11 19:52:25 +0100 |
commit | 71780abb89b56e976bccecea721581794df0f62b (patch) | |
tree | 8b1dd0e10c35781d23fbc44dd7da05a0e4adca1e /src/main/java/de/pixart/messenger/persistance/FileBackend.java | |
parent | 993fb18d520d629305d0c0da70acb53d6aa07c70 (diff) |
rework PDF preview
should fix #456
Diffstat (limited to '')
-rw-r--r-- | src/main/java/de/pixart/messenger/persistance/FileBackend.java | 84 |
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); |