diff --git a/src/com/android/gallery3d/data/Exif.java b/src/com/android/gallery3d/data/Exif.java index ba5862a863..aae4c241cd 100644 --- a/src/com/android/gallery3d/data/Exif.java +++ b/src/com/android/gallery3d/data/Exif.java @@ -153,7 +153,16 @@ public class Exif { private static boolean read(InputStream is, byte[] buf, int length) { try { - return is.read(buf, 0, length) == length; + int read; + int totalRead = 0; + while (totalRead != length) { + if ((read = is.read(buf, totalRead, length - totalRead)) < 0) { + Log.w(TAG, "stream EOF'd prematurely"); + return false; + } + totalRead += read; + } + return true; } catch (IOException ex) { return false; } diff --git a/src/org/thoughtcrime/securesms/jobs/ThumbnailGenerateJob.java b/src/org/thoughtcrime/securesms/jobs/ThumbnailGenerateJob.java index 593803de4e..0224d5871c 100644 --- a/src/org/thoughtcrime/securesms/jobs/ThumbnailGenerateJob.java +++ b/src/org/thoughtcrime/securesms/jobs/ThumbnailGenerateJob.java @@ -32,6 +32,7 @@ import org.thoughtcrime.securesms.sms.OutgoingKeyExchangeMessage; import org.thoughtcrime.securesms.util.BitmapDecodingException; import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; +import org.thoughtcrime.securesms.util.Util; import org.whispersystems.jobqueue.JobParameters; import org.whispersystems.libaxolotl.DuplicateMessageException; import org.whispersystems.libaxolotl.InvalidMessageException; @@ -99,7 +100,7 @@ public class ThumbnailGenerateJob extends MasterSecretJob { } private Bitmap generateThumbnailForPart(MasterSecret masterSecret, PduPart part) { - String contentType = new String(part.getContentType()); + String contentType = Util.toIsoString(part.getContentType()); if (ContentType.isImageType(contentType)) return generateImageThumbnail(masterSecret, part); else return null; @@ -109,7 +110,7 @@ public class ThumbnailGenerateJob extends MasterSecretJob { try { int maxSize = context.getResources().getDimensionPixelSize(R.dimen.thumbnail_max_size); return BitmapUtil.createScaledBitmap(context, masterSecret, part.getDataUri(), maxSize, maxSize); - } catch (FileNotFoundException | BitmapDecodingException e) { + } catch (FileNotFoundException | BitmapDecodingException | OutOfMemoryError e) { Log.w(TAG, e); return null; } diff --git a/src/org/thoughtcrime/securesms/util/BitmapUtil.java b/src/org/thoughtcrime/securesms/util/BitmapUtil.java index c7fff46332..f6e20e914c 100644 --- a/src/org/thoughtcrime/securesms/util/BitmapUtil.java +++ b/src/org/thoughtcrime/securesms/util/BitmapUtil.java @@ -68,7 +68,15 @@ public class BitmapUtil { public static Bitmap createScaledBitmap(Context context, MasterSecret masterSecret, Uri uri, int maxWidth, int maxHeight) throws BitmapDecodingException, FileNotFoundException { - return createScaledBitmap(context, masterSecret, uri, maxWidth, maxHeight, false); + Bitmap bitmap; + try { + bitmap = createScaledBitmap(context, masterSecret, uri, maxWidth, maxHeight, false); + } catch(OutOfMemoryError oome) { + Log.w(TAG, "OutOfMemoryError when scaling precisely, doing rough scale to save memory instead"); + bitmap = createScaledBitmap(context, masterSecret, uri, maxWidth, maxHeight, true); + } + + return bitmap; } private static Bitmap createScaledBitmap(Context context, MasterSecret masterSecret, Uri uri, int maxWidth, int maxHeight, boolean constrainedMemory)