diff --git a/src/org/thoughtcrime/securesms/util/BitmapUtil.java b/src/org/thoughtcrime/securesms/util/BitmapUtil.java index 9c8492eda9..9a9221958e 100644 --- a/src/org/thoughtcrime/securesms/util/BitmapUtil.java +++ b/src/org/thoughtcrime/securesms/util/BitmapUtil.java @@ -133,17 +133,11 @@ public class BitmapUtil { final int imageWidth = options.outWidth; final int imageHeight = options.outHeight; - int scaler = 1; - int scaleFactor = (constrainedMemory ? 1 : 2); - while ((imageWidth / scaler / scaleFactor >= maxWidth) && (imageHeight / scaler / scaleFactor >= maxHeight)) { - scaler *= 2; - } - - options.inSampleSize = scaler; + options.inSampleSize = getScaleFactor(imageWidth, imageHeight, maxWidth, maxHeight, constrainedMemory); options.inJustDecodeBounds = false; - BufferedInputStream is = new BufferedInputStream(data); - Bitmap roughThumbnail = BitmapFactory.decodeStream(is, null, options); + InputStream is = new BufferedInputStream(data); + Bitmap roughThumbnail = BitmapFactory.decodeStream(is, null, options); try { is.close(); } catch (IOException ioe) { @@ -189,6 +183,20 @@ public class BitmapUtil { } } + @VisibleForTesting static int getScaleFactor(int inWidth, int inHeight, + int maxWidth, int maxHeight, + boolean constrained) + { + int scaler = 1; + while (!constrained && ((inWidth / scaler / 2 >= maxWidth) && (inHeight / scaler / 2 >= maxHeight))) { + scaler *= 2; + } + while (constrained && ((inWidth / scaler > maxWidth) || (inHeight / scaler > maxHeight))) { + scaler *= 2; + } + return scaler; + } + private static Bitmap fixOrientation(Bitmap bitmap, InputStream orientationStream) { final int orientation = Exif.getOrientation(orientationStream); diff --git a/test/androidTest/java/org/thoughtcrime/securesms/util/BitmapUtilTest.java b/test/androidTest/java/org/thoughtcrime/securesms/util/BitmapUtilTest.java new file mode 100644 index 0000000000..e190dfc8c5 --- /dev/null +++ b/test/androidTest/java/org/thoughtcrime/securesms/util/BitmapUtilTest.java @@ -0,0 +1,34 @@ +package org.thoughtcrime.securesms.util; + +import org.thoughtcrime.securesms.TextSecureTestCase; + +public class BitmapUtilTest extends TextSecureTestCase { + public void testScaleFactorNormal() { + assertEquals(1, BitmapUtil.getScaleFactor(1000, 1000, 9000, 9000, false)); + + assertEquals(1, BitmapUtil.getScaleFactor(1000, 1000, 750, 750, false)); + assertEquals(2, BitmapUtil.getScaleFactor(1000, 1000, 500, 500, false)); + assertEquals(2, BitmapUtil.getScaleFactor(1000, 1000, 499, 499, false)); + assertEquals(4, BitmapUtil.getScaleFactor(1000, 1000, 250, 250, false)); + assertEquals(4, BitmapUtil.getScaleFactor(1000, 1000, 249, 249, false)); + + assertEquals(1, BitmapUtil.getScaleFactor(1000, 500, 750, 750, false)); + assertEquals(1, BitmapUtil.getScaleFactor(2000, 1000, 501, 501, false)); + assertEquals(2, BitmapUtil.getScaleFactor(2000, 1000, 500, 500, false)); + assertEquals(2, BitmapUtil.getScaleFactor(1000, 2000, 499, 499, false)); + } + + public void testScaleFactorConstrained() { + assertEquals(1, BitmapUtil.getScaleFactor(1000, 1000, 9000, 9000, true)); + + assertEquals(2, BitmapUtil.getScaleFactor(1000, 1000, 750, 750, true)); + assertEquals(2, BitmapUtil.getScaleFactor(1000, 1000, 500, 500, true)); + assertEquals(4, BitmapUtil.getScaleFactor(1000, 1000, 499, 499, true)); + assertEquals(4, BitmapUtil.getScaleFactor(1000, 1000, 250, 250, true)); + assertEquals(8, BitmapUtil.getScaleFactor(1000, 1000, 249, 249, true)); + + assertEquals(2, BitmapUtil.getScaleFactor(1000, 500, 750, 750, true)); + assertEquals(4, BitmapUtil.getScaleFactor(2000, 1000, 500, 500, true)); + assertEquals(8, BitmapUtil.getScaleFactor(1000, 2000, 499, 499, true)); + } +}