From 039c6edb66d3a15d3091cb0da5ec0a470f7d75de Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 14 Dec 2018 18:25:56 -0200 Subject: [PATCH 1/3] [android] increase scale levels of PhotoView --- .../briarproject/briar/android/conversation/ImageFragment.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageFragment.java index ba4bfec9c..d6ba5b7ee 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageFragment.java @@ -77,6 +77,7 @@ public class ImageFragment extends Fragment { viewModelFactory).get(ImageViewModel.class); photoView = v.findViewById(R.id.photoView); + photoView.setScaleLevels(1, 2, 4); photoView.setOnClickListener(view -> viewModel.clickImage()); // Request Listener @@ -113,6 +114,8 @@ public class ImageFragment extends Fragment { // Load Image GlideApp.with(this) .load(attachment) + // TODO allow if < maxTextureSize ? +// .override(SIZE_ORIGINAL) .diskCacheStrategy(NONE) .error(R.drawable.ic_image_broken) .dontTransform() From d3b6f484c8f0c11531917de69f23472cc888d9ed Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 14 Dec 2018 19:28:35 -0200 Subject: [PATCH 2/3] [android] allow image transformations in full-screen view to prevent crashes from huge images --- .../briarproject/briar/android/conversation/ImageFragment.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageFragment.java index d6ba5b7ee..bf7ff5791 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageFragment.java @@ -114,11 +114,10 @@ public class ImageFragment extends Fragment { // Load Image GlideApp.with(this) .load(attachment) - // TODO allow if < maxTextureSize ? + // TODO allow if size < maxTextureSize ? // .override(SIZE_ORIGINAL) .diskCacheStrategy(NONE) .error(R.drawable.ic_image_broken) - .dontTransform() .addListener(listener) .into(photoView); From 1d09a6708a68c54de02b1ceded588080637a3882 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 14 Dec 2018 20:09:51 -0200 Subject: [PATCH 3/3] [android] don't ever load an entire image into memory This happens on API 27+28 if loading TIFF or WebP files. Using an InputStream with a read limit prevents this. --- .../conversation/AttachmentController.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentController.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentController.java index ed82c5adf..9285f9a8d 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentController.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentController.java @@ -6,6 +6,8 @@ import android.support.annotation.Nullable; import android.support.media.ExifInterface; import android.webkit.MimeTypeMap; +import com.bumptech.glide.util.MarkEnforcingInputStream; + import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; @@ -44,6 +46,7 @@ class AttachmentController { private static final Logger LOG = getLogger(AttachmentController.class.getName()); + private static final int READ_LIMIT = 1024 * 8192; private final MessagingManager messagingManager; private final int defaultSize; @@ -128,8 +131,9 @@ class AttachmentController { } Size size = new Size(); - InputStream is = new BufferedInputStream(a.getStream()); - is.mark(Integer.MAX_VALUE); + InputStream is = new MarkEnforcingInputStream( + new BufferedInputStream(a.getStream())); + is.mark(READ_LIMIT); try { // use exif to get size if (h.getContentType().equals("image/jpeg")) { @@ -142,6 +146,8 @@ class AttachmentController { // use BitmapFactory to get size if (size.error) { is.reset(); + // need to mark again to re-add read limit + is.mark(READ_LIMIT); size = getSizeFromBitmap(is); } } catch (IOException e) { @@ -158,12 +164,11 @@ class AttachmentController { } // get file extension String extension = getExtensionFromMimeType(size.mimeType); - if (extension == null) { - return new AttachmentItem(messageId, 0, 0, "", "", 0, 0, true); - } + boolean hasError = extension == null || size.error; + if (extension == null) extension = ""; return new AttachmentItem(messageId, size.width, size.height, size.mimeType, extension, thumbnailSize.width, - thumbnailSize.height, size.error); + thumbnailSize.height, hasError); } @Nullable