Bitmap OOM and rotation fixes

// FREEBIE
master
Jake McGinty 2014-12-29 16:40:37 -08:00
parent bec5e45605
commit 348352cc71
3 changed files with 22 additions and 4 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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)