From d519b67e8c1e0558695ceaf19c594f64acfa3fb6 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 20 Nov 2019 17:27:02 -0800 Subject: [PATCH 1/6] fix a crash when a non-image file is pick --- packages/image_picker/CHANGELOG.md | 6 +- .../imagepicker/ImagePickerDelegate.java | 5 +- .../plugins/imagepicker/ImageResizer.java | 57 +++++++++--- .../plugins/imagepicker/ImageResizerTest.java | 90 +++++++++++++++++++ packages/image_picker/pubspec.yaml | 2 +- 5 files changed, 141 insertions(+), 19 deletions(-) create mode 100644 packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java diff --git a/packages/image_picker/CHANGELOG.md b/packages/image_picker/CHANGELOG.md index 11c48e8724bc..121d7c9603c8 100644 --- a/packages/image_picker/CHANGELOG.md +++ b/packages/image_picker/CHANGELOG.md @@ -1,6 +1,10 @@ +## 0.6.2+1 + +* Android: Fix a crash when a non-image file is picked. + ## 0.6.2 -* iOS: Fixes an issue where picking conent from Gallery would result in a crash on iOS 13. +* iOS: Fixes an issue where picking content from Gallery would result in a crash on iOS 13. ## 0.6.1+11 diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index f9318e9c5760..e34a3b5632c0 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -521,10 +521,7 @@ private void handleImageResult(String path, boolean shouldDeleteOriginalIfScaled if (methodCall != null) { Double maxWidth = methodCall.argument("maxWidth"); Double maxHeight = methodCall.argument("maxHeight"); - int imageQuality = - methodCall.argument("imageQuality") == null - ? 100 - : (int) methodCall.argument("imageQuality"); + Integer imageQuality = methodCall.argument("imageQuality"); String finalImagePath = imageResizer.resizeImageIfNeeded(path, maxWidth, maxHeight, imageQuality); diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java index ab3120afb6d0..b6831f0d1276 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java @@ -7,6 +7,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; +import androidx.annotation.VisibleForTesting; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -28,17 +29,25 @@ class ImageResizer { *

If no resizing is needed, returns the path for the original image. */ String resizeImageIfNeeded( - String imagePath, Double maxWidth, Double maxHeight, int imageQuality) { + String imagePath, Double maxWidth, Double maxHeight, Integer imageQuality) { boolean shouldScale = - maxWidth != null || maxHeight != null || (imageQuality > -1 && imageQuality < 101); + maxWidth != null + || maxHeight != null + || (imageQuality != null && imageQuality > -1 && imageQuality < 101); if (!shouldScale) { return imagePath; } try { - File scaledImage = resizedImage(imagePath, maxWidth, maxHeight, imageQuality); - exifDataCopier.copyExif(imagePath, scaledImage.getPath()); + Bitmap bmp = decodeFile(imagePath); + if (bmp == null) { + return null; + } + String[] pathParts = imagePath.split("/"); + String imageName = pathParts[pathParts.length - 1]; + File scaledImage = resizedImage(bmp, maxWidth, maxHeight, imageQuality, imageName); + copyExif(imagePath, scaledImage.getPath()); return scaledImage.getPath(); } catch (IOException e) { @@ -46,13 +55,13 @@ String resizeImageIfNeeded( } } - private File resizedImage(String path, Double maxWidth, Double maxHeight, int imageQuality) + private File resizedImage( + Bitmap bmp, Double maxWidth, Double maxHeight, Integer imageQuality, String outputImageName) throws IOException { - Bitmap bmp = BitmapFactory.decodeFile(path); double originalWidth = bmp.getWidth() * 1.0; double originalHeight = bmp.getHeight() * 1.0; - if (imageQuality < 0 || imageQuality > 100) { + if (imageQuality == null || imageQuality < 0 || imageQuality > 100) { imageQuality = 100; } @@ -91,7 +100,7 @@ private File resizedImage(String path, Double maxWidth, Double maxHeight, int im } } - Bitmap scaledBmp = Bitmap.createScaledBitmap(bmp, width.intValue(), height.intValue(), false); + Bitmap scaledBmp = createScaledBitmap(bmp, width.intValue(), height.intValue(), false); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); boolean saveAsPNG = bmp.hasAlpha(); if (saveAsPNG) { @@ -104,13 +113,35 @@ private File resizedImage(String path, Double maxWidth, Double maxHeight, int im imageQuality, outputStream); - String[] pathParts = path.split("/"); - String imageName = pathParts[pathParts.length - 1]; - - File imageFile = new File(externalFilesDirectory, "/scaled_" + imageName); - FileOutputStream fileOutput = new FileOutputStream(imageFile); + File imageFile = createFile(externalFilesDirectory, "/scaled_" + outputImageName); + FileOutputStream fileOutput = createOutputStream(imageFile); fileOutput.write(outputStream.toByteArray()); fileOutput.close(); return imageFile; } + + @VisibleForTesting + File createFile(File externalFilesDirectory, String child) { + return new File(externalFilesDirectory, child); + } + + @VisibleForTesting + FileOutputStream createOutputStream(File imageFile) throws IOException { + return new FileOutputStream(imageFile); + } + + @VisibleForTesting + void copyExif(String filePathOri, String filePathDest) { + exifDataCopier.copyExif(filePathOri, filePathDest); + } + + @VisibleForTesting + Bitmap decodeFile(String path) { + return BitmapFactory.decodeFile(path); + } + + @VisibleForTesting + Bitmap createScaledBitmap(Bitmap bmp, int width, int height, boolean filter) { + return Bitmap.createScaledBitmap(bmp, width, height, filter); + } } diff --git a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java new file mode 100644 index 000000000000..ff127447ae94 --- /dev/null +++ b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java @@ -0,0 +1,90 @@ +// Copyright 2019 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.imagepicker; + +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; + +import android.graphics.Bitmap; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +public class ImageResizerTest { + + @Mock Bitmap mockBitMap; + @Mock Bitmap mockScaledBitMap; + @Spy @InjectMocks ImageResizer resizer; + @Mock File mockFile; + @Mock FileOutputStream mockOutputStream; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mockBitMap.getWidth()).thenReturn(100); + when(mockBitMap.getHeight()).thenReturn(100); + when(mockBitMap.hasAlpha()).thenReturn(true); + doReturn(mockBitMap).when(resizer).decodeFile(any(String.class)); + doReturn(mockScaledBitMap) + .when(resizer) + .createScaledBitmap(any(Bitmap.class), any(int.class), any(int.class), any(boolean.class)); + when(mockScaledBitMap.getWidth()).thenReturn(100); + when(mockScaledBitMap.getHeight()).thenReturn(100); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + when(mockFile.getPath()).thenReturn("scaledFolder" + invocation.getArgument(1)); + return mockFile; + } + }) + .when(resizer) + .createFile(any(File.class), any(String.class)); + + try { + doReturn(mockOutputStream).when(resizer).createOutputStream(mockFile); + } catch (IOException e) { + throw new RuntimeException(e); + } + doNothing().when(resizer).copyExif(any(String.class), any(String.class)); + } + + @Test + public void onResizeImageIfNeeded_WhenQualityIsNull_ShoultNotResize_ReturnTheSameFile() { + String outoutFile = resizer.resizeImageIfNeeded("dummyFolder/dummyPath.png", null, null, null); + assertThat(outoutFile, equalTo("dummyFolder/dummyPath.png")); + } + + @Test + public void onResizeImageIfNeeded_WhenQualityIsNotNull_ShoulResize_ReturnResizedFile() { + String outoutFile = resizer.resizeImageIfNeeded("dummyFolder/dummyPath.png", null, null, 50); + assertThat(outoutFile, equalTo("scaledFolder/scaled_dummyPath.png")); + } + + @Test + public void onResizeImageIfNeeded_WhenWidthIsNotNull_ShoulResize_ReturnResizedFile() { + String outoutFile = resizer.resizeImageIfNeeded("dummyFolder/dummyPath.png", 100.0, null, null); + assertThat(outoutFile, equalTo("scaledFolder/scaled_dummyPath.png")); + } + + @Test + public void onResizeImageIfNeeded_WhenHeightIsNotNull_ShoulResize_ReturnResizedFile() { + String outoutFile = resizer.resizeImageIfNeeded("dummyFolder/dummyPath.png", null, 100.0, null); + assertThat(outoutFile, equalTo("scaledFolder/scaled_dummyPath.png")); + } +} diff --git a/packages/image_picker/pubspec.yaml b/packages/image_picker/pubspec.yaml index bca5a9df2059..0e47c53e6911 100755 --- a/packages/image_picker/pubspec.yaml +++ b/packages/image_picker/pubspec.yaml @@ -5,7 +5,7 @@ authors: - Flutter Team - Rhodes Davis Jr. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker -version: 0.6.2 +version: 0.6.2+1 flutter: plugin: From ad38dc82da1555c54638a215097f7c6a2eaf05c4 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 20 Nov 2019 17:34:34 -0800 Subject: [PATCH 2/6] syntax cleanning --- .../flutter/plugins/imagepicker/ImageResizerTest.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java index ff127447ae94..c948e1cc9364 100644 --- a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java +++ b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java @@ -23,7 +23,6 @@ import org.mockito.MockitoAnnotations; import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; public class ImageResizerTest { @@ -46,12 +45,9 @@ public void setUp() { when(mockScaledBitMap.getWidth()).thenReturn(100); when(mockScaledBitMap.getHeight()).thenReturn(100); doAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - when(mockFile.getPath()).thenReturn("scaledFolder" + invocation.getArgument(1)); - return mockFile; - } + (InvocationOnMock invocation) -> { + when(mockFile.getPath()).thenReturn("scaledFolder" + invocation.getArgument(1)); + return mockFile; }) .when(resizer) .createFile(any(File.class), any(String.class)); From f40c8240ef8e2515e25b5bc4332c054ca30357f0 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 20 Nov 2019 17:36:03 -0800 Subject: [PATCH 3/6] changelog updates --- packages/image_picker/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/image_picker/CHANGELOG.md b/packages/image_picker/CHANGELOG.md index 121d7c9603c8..96bb4fcad8c3 100644 --- a/packages/image_picker/CHANGELOG.md +++ b/packages/image_picker/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.6.2+1 * Android: Fix a crash when a non-image file is picked. +* Android: Fix unwanted bitmap scaling. ## 0.6.2 From 0bfa8929c85770de6c68b005ddb46f3e017a3ff4 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 21 Nov 2019 17:54:30 -0800 Subject: [PATCH 4/6] use RobolectricTestRunner --- .../plugins/imagepicker/ImageResizer.java | 97 +++++++++--------- .../example/android/app/build.gradle | 1 + .../plugins/imagepicker/ImageResizerTest.java | 75 +++++--------- .../app/src/test/resources/pngImage.png | Bin 0 -> 629 bytes 4 files changed, 79 insertions(+), 94 deletions(-) create mode 100644 packages/image_picker/example/android/app/src/test/resources/pngImage.png diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java index b6831f0d1276..7f8b6c50f2e8 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java @@ -7,7 +7,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; -import androidx.annotation.VisibleForTesting; +import androidx.annotation.Nullable; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -29,27 +29,27 @@ class ImageResizer { *

If no resizing is needed, returns the path for the original image. */ String resizeImageIfNeeded( - String imagePath, Double maxWidth, Double maxHeight, Integer imageQuality) { + String imagePath, + @Nullable Double maxWidth, + @Nullable Double maxHeight, + @Nullable Integer imageQuality) { boolean shouldScale = - maxWidth != null - || maxHeight != null - || (imageQuality != null && imageQuality > -1 && imageQuality < 101); - - if (!shouldScale) { - return imagePath; + maxWidth != null || maxHeight != null || isImageQualityValid(imageQuality); + String[] pathParts = imagePath.split("/"); + String imageName = pathParts[pathParts.length - 1]; + File file; + Bitmap bmp = decodeFile(imagePath); + if (bmp == null) { + return null; } - try { - Bitmap bmp = decodeFile(imagePath); - if (bmp == null) { - return null; + if (!shouldScale) { + file = createImageOnExternalDirectory(imageName, bmp, 100); + } else { + file = resizedImage(bmp, maxWidth, maxHeight, imageQuality, imageName); } - String[] pathParts = imagePath.split("/"); - String imageName = pathParts[pathParts.length - 1]; - File scaledImage = resizedImage(bmp, maxWidth, maxHeight, imageQuality, imageName); - copyExif(imagePath, scaledImage.getPath()); - - return scaledImage.getPath(); + copyExif(imagePath, file.getPath()); + return file.getPath(); } catch (IOException e) { throw new RuntimeException(e); } @@ -61,7 +61,7 @@ private File resizedImage( double originalWidth = bmp.getWidth() * 1.0; double originalHeight = bmp.getHeight() * 1.0; - if (imageQuality == null || imageQuality < 0 || imageQuality > 100) { + if (!isImageQualityValid(imageQuality)) { imageQuality = 100; } @@ -101,47 +101,52 @@ private File resizedImage( } Bitmap scaledBmp = createScaledBitmap(bmp, width.intValue(), height.intValue(), false); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - boolean saveAsPNG = bmp.hasAlpha(); - if (saveAsPNG) { - Log.d( - "ImageResizer", - "image_picker: compressing is not supported for type PNG. Returning the image with original quality"); - } - scaledBmp.compress( - saveAsPNG ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.JPEG, - imageQuality, - outputStream); - - File imageFile = createFile(externalFilesDirectory, "/scaled_" + outputImageName); - FileOutputStream fileOutput = createOutputStream(imageFile); - fileOutput.write(outputStream.toByteArray()); - fileOutput.close(); - return imageFile; + File file = + createImageOnExternalDirectory("/scaled_" + outputImageName, scaledBmp, imageQuality); + return file; } - @VisibleForTesting - File createFile(File externalFilesDirectory, String child) { + private File createFile(File externalFilesDirectory, String child) { return new File(externalFilesDirectory, child); } - @VisibleForTesting - FileOutputStream createOutputStream(File imageFile) throws IOException { + private FileOutputStream createOutputStream(File imageFile) throws IOException { return new FileOutputStream(imageFile); } - @VisibleForTesting - void copyExif(String filePathOri, String filePathDest) { + private void copyExif(String filePathOri, String filePathDest) { exifDataCopier.copyExif(filePathOri, filePathDest); } - @VisibleForTesting - Bitmap decodeFile(String path) { + private Bitmap decodeFile(String path) { return BitmapFactory.decodeFile(path); } - @VisibleForTesting - Bitmap createScaledBitmap(Bitmap bmp, int width, int height, boolean filter) { + private Bitmap createScaledBitmap(Bitmap bmp, int width, int height, boolean filter) { return Bitmap.createScaledBitmap(bmp, width, height, filter); } + + private boolean isImageQualityValid(Integer imageQuality) { + return imageQuality != null && imageQuality > 0 && imageQuality <= 100; + } + + private File createImageOnExternalDirectory(String name, Bitmap bitmap, int imageQuality) + throws IOException { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + boolean saveAsPNG = bitmap.hasAlpha(); + if (saveAsPNG) { + Log.d( + "ImageResizer", + "image_picker: compressing is not supported for type PNG. Returning the image with original quality"); + } + bitmap.compress( + saveAsPNG ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.JPEG, + imageQuality, + outputStream); + File imageFile = createFile(externalFilesDirectory, name); + FileOutputStream fileOutput = createOutputStream(imageFile); + fileOutput.write(outputStream.toByteArray()); + fileOutput.close(); + return imageFile; + } } diff --git a/packages/image_picker/example/android/app/build.gradle b/packages/image_picker/example/android/app/build.gradle index 800e3e836a97..483268fdc18c 100755 --- a/packages/image_picker/example/android/app/build.gradle +++ b/packages/image_picker/example/android/app/build.gradle @@ -62,4 +62,5 @@ dependencies { testImplementation 'org.mockito:mockito-core:2.17.0' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + testImplementation "org.robolectric:robolectric:3.3.2" } diff --git a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java index c948e1cc9364..aac7472eaac3 100644 --- a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java +++ b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java @@ -6,81 +6,60 @@ import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.when; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import org.junit.Before; import org.junit.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; -import org.mockito.Spy; -import org.mockito.invocation.InvocationOnMock; +import org.robolectric.RobolectricTestRunner; +// RobolectricTestRunner always creates a default mock bitmap when reading from file. So we cannot actually test the scaling. +// But we can still test whether the original or scaled file is created. +@RunWith(RobolectricTestRunner.class) public class ImageResizerTest { - @Mock Bitmap mockBitMap; - @Mock Bitmap mockScaledBitMap; - @Spy @InjectMocks ImageResizer resizer; - @Mock File mockFile; - @Mock FileOutputStream mockOutputStream; + ImageResizer resizer; + File imageFile; + File externalDirectory; + Bitmap originalImageBitmap; @Before - public void setUp() { + public void setUp() throws IOException { MockitoAnnotations.initMocks(this); - when(mockBitMap.getWidth()).thenReturn(100); - when(mockBitMap.getHeight()).thenReturn(100); - when(mockBitMap.hasAlpha()).thenReturn(true); - doReturn(mockBitMap).when(resizer).decodeFile(any(String.class)); - doReturn(mockScaledBitMap) - .when(resizer) - .createScaledBitmap(any(Bitmap.class), any(int.class), any(int.class), any(boolean.class)); - when(mockScaledBitMap.getWidth()).thenReturn(100); - when(mockScaledBitMap.getHeight()).thenReturn(100); - doAnswer( - (InvocationOnMock invocation) -> { - when(mockFile.getPath()).thenReturn("scaledFolder" + invocation.getArgument(1)); - return mockFile; - }) - .when(resizer) - .createFile(any(File.class), any(String.class)); - - try { - doReturn(mockOutputStream).when(resizer).createOutputStream(mockFile); - } catch (IOException e) { - throw new RuntimeException(e); - } - doNothing().when(resizer).copyExif(any(String.class), any(String.class)); + imageFile = new File(getClass().getClassLoader().getResource("pngImage.png").getFile()); + originalImageBitmap = BitmapFactory.decodeFile(imageFile.getPath()); + TemporaryFolder temporaryFolder = new TemporaryFolder(); + temporaryFolder.create(); + externalDirectory = temporaryFolder.newFolder("image_picker_testing_path"); + resizer = new ImageResizer(externalDirectory, new ExifDataCopier()); } @Test - public void onResizeImageIfNeeded_WhenQualityIsNull_ShoultNotResize_ReturnTheSameFile() { - String outoutFile = resizer.resizeImageIfNeeded("dummyFolder/dummyPath.png", null, null, null); - assertThat(outoutFile, equalTo("dummyFolder/dummyPath.png")); + public void onResizeImageIfNeeded_WhenQualityIsNull_ShoultNotResize_ReturnTheUnscaledFile() { + String outoutFile = resizer.resizeImageIfNeeded(imageFile.getPath(), null, null, null); + assertThat(outoutFile, equalTo(externalDirectory.getPath() + "/pngImage.png")); } @Test public void onResizeImageIfNeeded_WhenQualityIsNotNull_ShoulResize_ReturnResizedFile() { - String outoutFile = resizer.resizeImageIfNeeded("dummyFolder/dummyPath.png", null, null, 50); - assertThat(outoutFile, equalTo("scaledFolder/scaled_dummyPath.png")); + String outoutFile = resizer.resizeImageIfNeeded(imageFile.getPath(), null, null, 50); + assertThat(outoutFile, equalTo(externalDirectory.getPath() + "/scaled_pngImage.png")); } @Test public void onResizeImageIfNeeded_WhenWidthIsNotNull_ShoulResize_ReturnResizedFile() { - String outoutFile = resizer.resizeImageIfNeeded("dummyFolder/dummyPath.png", 100.0, null, null); - assertThat(outoutFile, equalTo("scaledFolder/scaled_dummyPath.png")); + String outoutFile = resizer.resizeImageIfNeeded(imageFile.getPath(), 50.0, null, null); + assertThat(outoutFile, equalTo(externalDirectory.getPath() + "/scaled_pngImage.png")); } @Test public void onResizeImageIfNeeded_WhenHeightIsNotNull_ShoulResize_ReturnResizedFile() { - String outoutFile = resizer.resizeImageIfNeeded("dummyFolder/dummyPath.png", null, 100.0, null); - assertThat(outoutFile, equalTo("scaledFolder/scaled_dummyPath.png")); + String outoutFile = resizer.resizeImageIfNeeded(imageFile.getPath(), null, 50.0, null); + assertThat(outoutFile, equalTo(externalDirectory.getPath() + "/scaled_pngImage.png")); } } diff --git a/packages/image_picker/example/android/app/src/test/resources/pngImage.png b/packages/image_picker/example/android/app/src/test/resources/pngImage.png new file mode 100644 index 0000000000000000000000000000000000000000..22ac5a5a1485e2df792d72317d11e7c543bca4de GIT binary patch literal 629 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5l;AAzh%9DcU>62q#&Zh% z96-Y_WrjqQMELqxCFkerC8p#jrRr7W764TzC zHb_`sNdc^+B->Ug!Z$#{Ilm}X!Bo#g&p^qJOF==wrYI%ND#*nRsvXF)RmvzSDX`Ml zFE20GD>v55FG|-pw6wI;H!#vSGSUUA&@HaaD@m--%_~-h7y>iLCAB!YD6^m>Ge1uO zWNu(Fge&DHI?<3>F23u^pF Date: Thu, 21 Nov 2019 21:11:03 -0800 Subject: [PATCH 5/6] fix failing tests --- .../flutter/plugins/imagepicker/ImageResizer.java | 2 +- .../plugins/imagepicker/ImagePickerCacheTest.java | 3 --- .../imagepicker/ImagePickerDelegateTest.java | 15 +++++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java index 7f8b6c50f2e8..ca0498bfa55b 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java @@ -127,7 +127,7 @@ private Bitmap createScaledBitmap(Bitmap bmp, int width, int height, boolean fil } private boolean isImageQualityValid(Integer imageQuality) { - return imageQuality != null && imageQuality > 0 && imageQuality <= 100; + return imageQuality != null && imageQuality > 0 && imageQuality < 100; } private File createImageOnExternalDirectory(String name, Bitmap bitmap, int imageQuality) diff --git a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerCacheTest.java b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerCacheTest.java index 8e89a15abc8e..51733a503a92 100644 --- a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerCacheTest.java +++ b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerCacheTest.java @@ -25,10 +25,7 @@ import org.mockito.MockitoAnnotations; public class ImagePickerCacheTest { - private static final double WIDTH = 10.0; - private static final double HEIGHT = 10.0; private static final int IMAGE_QUALITY = 90; - private static final String PATH = "a_mock_path"; @Mock Activity mockActivity; @Mock SharedPreferences mockPreference; diff --git a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java index 60e1167cd87a..213814cad484 100644 --- a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java +++ b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java @@ -24,9 +24,9 @@ import org.mockito.MockitoAnnotations; public class ImagePickerDelegateTest { - private static final double WIDTH = 10.0; - private static final double HEIGHT = 10.0; - private static final int IMAGE_QUALITY = 100; + private static final Double WIDTH = 10.0; + private static final Double HEIGHT = 10.0; + private static final Integer IMAGE_QUALITY = 90; @Mock Activity mockActivity; @Mock ImageResizer mockImageResizer; @@ -62,13 +62,16 @@ public void setUp() { when(mockFileUtils.getPathFromUri(any(Context.class), any(Uri.class))) .thenReturn("pathFromUri"); + + when(mockImageResizer.resizeImageIfNeeded("pathFromUri", null, null, null)) + .thenReturn("originalPath"); when(mockImageResizer.resizeImageIfNeeded("pathFromUri", null, null, IMAGE_QUALITY)) .thenReturn("originalPath"); - when(mockImageResizer.resizeImageIfNeeded("pathFromUri", WIDTH, HEIGHT, IMAGE_QUALITY)) + when(mockImageResizer.resizeImageIfNeeded("pathFromUri", WIDTH, HEIGHT, null)) .thenReturn("scaledPath"); - when(mockImageResizer.resizeImageIfNeeded("pathFromUri", WIDTH, null, IMAGE_QUALITY)) + when(mockImageResizer.resizeImageIfNeeded("pathFromUri", WIDTH, null, null)) .thenReturn("scaledPath"); - when(mockImageResizer.resizeImageIfNeeded("pathFromUri", null, HEIGHT, IMAGE_QUALITY)) + when(mockImageResizer.resizeImageIfNeeded("pathFromUri", null, HEIGHT, null)) .thenReturn("scaledPath"); mockFileUriResolver = new MockFileUriResolver(); From 8242a645bfedf45996ff7144d4d69304173e6289 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 21 Nov 2019 21:12:58 -0800 Subject: [PATCH 6/6] formatting --- .../flutter/plugins/imagepicker/ImagePickerDelegateTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java index 213814cad484..88fa3372766f 100644 --- a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java +++ b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java @@ -62,9 +62,8 @@ public void setUp() { when(mockFileUtils.getPathFromUri(any(Context.class), any(Uri.class))) .thenReturn("pathFromUri"); - when(mockImageResizer.resizeImageIfNeeded("pathFromUri", null, null, null)) - .thenReturn("originalPath"); + .thenReturn("originalPath"); when(mockImageResizer.resizeImageIfNeeded("pathFromUri", null, null, IMAGE_QUALITY)) .thenReturn("originalPath"); when(mockImageResizer.resizeImageIfNeeded("pathFromUri", WIDTH, HEIGHT, null))