From 33556c087c8aafd541d407372fa92a138d5b64bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Thu, 12 Jan 2023 09:45:26 -0300 Subject: [PATCH 01/15] Improved Bitmap resize on Android --- .../plugins/imagepicker/ImageResizer.java | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java index 2a93785678af..26929b502aef 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java @@ -33,8 +33,10 @@ String resizeImageIfNeeded( @Nullable Double maxWidth, @Nullable Double maxHeight, @Nullable Integer imageQuality) { - Bitmap bmp = decodeFile(imagePath); - if (bmp == null) { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + decodeFile(imagePath, options); + if (options.outWidth == -1 || options.outHeight == -1) { return null; } boolean shouldScale = @@ -45,7 +47,9 @@ String resizeImageIfNeeded( try { String[] pathParts = imagePath.split("/"); String imageName = pathParts[pathParts.length - 1]; - File file = resizedImage(bmp, maxWidth, maxHeight, imageQuality, imageName); + options.inSampleSize = calculateInSampleSize(options, maxWidth.intValue(), maxHeight.intValue()); + options.inJustDecodeBounds = false; + File file = resizedImage(decodeFile(imagePath, options), maxWidth, maxHeight, imageQuality, imageName); copyExif(imagePath, file.getPath()); return file.getPath(); } catch (IOException e) { @@ -120,8 +124,8 @@ private void copyExif(String filePathOri, String filePathDest) { exifDataCopier.copyExif(filePathOri, filePathDest); } - private Bitmap decodeFile(String path) { - return BitmapFactory.decodeFile(path); + private Bitmap decodeFile(String path, @Nullable BitmapFactory.Options opts) { + return BitmapFactory.decodeFile(path, opts); } private Bitmap createScaledBitmap(Bitmap bmp, int width, int height, boolean filter) { @@ -132,6 +136,21 @@ private boolean isImageQualityValid(Integer imageQuality) { return imageQuality != null && imageQuality > 0 && imageQuality < 100; } + private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { + final int height = options.outHeight; + final int width = options.outWidth; + int inSampleSize = 1; + if (height > reqHeight || width > reqWidth) { + final int halfHeight = height / 2; + final int halfWidth = width / 2; + while ((halfHeight / inSampleSize) >= reqHeight + && (halfWidth / inSampleSize) >= reqWidth) { + inSampleSize *= 2; + } + } + return inSampleSize; + } + private File createImageOnExternalDirectory(String name, Bitmap bitmap, int imageQuality) throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); From ed04a7118b01ec14188ebda7780b9aa4f289be69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Thu, 12 Jan 2023 10:07:56 -0300 Subject: [PATCH 02/15] Format code --- .../io/flutter/plugins/imagepicker/ImageResizer.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java index 26929b502aef..7323b266df64 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java @@ -47,9 +47,12 @@ String resizeImageIfNeeded( try { String[] pathParts = imagePath.split("/"); String imageName = pathParts[pathParts.length - 1]; - options.inSampleSize = calculateInSampleSize(options, maxWidth.intValue(), maxHeight.intValue()); + options.inSampleSize = + calculateInSampleSize(options, maxWidth.intValue(), maxHeight.intValue()); options.inJustDecodeBounds = false; - File file = resizedImage(decodeFile(imagePath, options), maxWidth, maxHeight, imageQuality, imageName); + File file = + resizedImage( + decodeFile(imagePath, options), maxWidth, maxHeight, imageQuality, imageName); copyExif(imagePath, file.getPath()); return file.getPath(); } catch (IOException e) { @@ -143,8 +146,7 @@ private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, i if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; - while ((halfHeight / inSampleSize) >= reqHeight - && (halfWidth / inSampleSize) >= reqWidth) { + while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) { inSampleSize *= 2; } } From d6f71f61685da749656df3292c2b867062845929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Thu, 12 Jan 2023 10:15:24 -0300 Subject: [PATCH 03/15] Format code --- .../java/io/flutter/plugins/imagepicker/ImageResizer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java index 7323b266df64..6e5d740e0ac6 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java @@ -47,10 +47,10 @@ String resizeImageIfNeeded( try { String[] pathParts = imagePath.split("/"); String imageName = pathParts[pathParts.length - 1]; - options.inSampleSize = + options.inSampleSize = calculateInSampleSize(options, maxWidth.intValue(), maxHeight.intValue()); options.inJustDecodeBounds = false; - File file = + File file = resizedImage( decodeFile(imagePath, options), maxWidth, maxHeight, imageQuality, imageName); copyExif(imagePath, file.getPath()); From a28f612e0a05c86ceaac8343bf0fda6c17093b7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Thu, 12 Jan 2023 10:25:10 -0300 Subject: [PATCH 04/15] Update version and changelog --- packages/image_picker/image_picker_android/CHANGELOG.md | 4 ++++ packages/image_picker/image_picker_android/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker_android/CHANGELOG.md b/packages/image_picker/image_picker_android/CHANGELOG.md index b041761181d0..a1613352bc8b 100644 --- a/packages/image_picker/image_picker_android/CHANGELOG.md +++ b/packages/image_picker/image_picker_android/CHANGELOG.md @@ -1,5 +1,9 @@ ## 0.8.5+4 +* Improves Bitmap resizing on Android. + +## 0.8.5+4 + * Fixes null cast exception when restoring a cancelled selection. ## 0.8.5+3 diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml index 4c32e345007c..461ddfc1c437 100755 --- a/packages/image_picker/image_picker_android/pubspec.yaml +++ b/packages/image_picker/image_picker_android/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_android description: Android implementation of the image_picker plugin. repository: https://github.com/flutter/plugins/tree/main/packages/image_picker/image_picker_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.8.5+4 +version: 0.8.5+5 environment: sdk: ">=2.14.0 <3.0.0" From 378dc9756f5fc40c5229c8c116a5f4fa47c538a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Thu, 12 Jan 2023 10:26:10 -0300 Subject: [PATCH 05/15] Fix typo --- packages/image_picker/image_picker_android/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker_android/CHANGELOG.md b/packages/image_picker/image_picker_android/CHANGELOG.md index a1613352bc8b..8d4c6bf9b272 100644 --- a/packages/image_picker/image_picker_android/CHANGELOG.md +++ b/packages/image_picker/image_picker_android/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.8.5+4 +## 0.8.5+5 * Improves Bitmap resizing on Android. From ae3e929df43183dcf29a47208a3eae54496b9c81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Thu, 12 Jan 2023 12:49:16 -0300 Subject: [PATCH 06/15] Pass tests --- .../plugins/imagepicker/ImageResizer.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java index 6e5d740e0ac6..6ccaffccbf45 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java +++ b/packages/image_picker/image_picker_android/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 android.util.Size; import androidx.annotation.Nullable; import java.io.ByteArrayOutputStream; import java.io.File; @@ -47,8 +48,13 @@ String resizeImageIfNeeded( try { String[] pathParts = imagePath.split("/"); String imageName = pathParts[pathParts.length - 1]; - options.inSampleSize = - calculateInSampleSize(options, maxWidth.intValue(), maxHeight.intValue()); + Size size = + calculateSize( + Double.valueOf(options.outWidth), + Double.valueOf(options.outHeight), + maxWidth, + maxHeight); + options.inSampleSize = calculateInSampleSize(options, size.getWidth(), size.getHeight()); options.inJustDecodeBounds = false; File file = resizedImage( @@ -70,6 +76,15 @@ private File resizedImage( imageQuality = 100; } + Size size = calculateSize(originalWidth, originalHeight, maxWidth, maxHeight); + Bitmap scaledBmp = createScaledBitmap(bmp, size.getWidth(), size.getHeight(), false); + File file = + createImageOnExternalDirectory("/scaled_" + outputImageName, scaledBmp, imageQuality); + return file; + } + + private Size calculateSize( + Double originalWidth, Double originalHeight, Double maxWidth, Double maxHeight) { boolean hasMaxWidth = maxWidth != null; boolean hasMaxHeight = maxHeight != null; @@ -105,10 +120,7 @@ private File resizedImage( } } - Bitmap scaledBmp = createScaledBitmap(bmp, width.intValue(), height.intValue(), false); - File file = - createImageOnExternalDirectory("/scaled_" + outputImageName, scaledBmp, imageQuality); - return file; + return new Size(width.intValue(), height.intValue()); } private File createFile(File externalFilesDirectory, String child) { From 7358274dbfea92734ba02d3fbef5721e20b1b340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Thu, 12 Jan 2023 13:09:56 -0300 Subject: [PATCH 07/15] Fix lint warnings --- .../flutter/plugins/imagepicker/ImageResizer.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java index 6ccaffccbf45..620ce53f0cb3 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java @@ -6,8 +6,8 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Point; import android.util.Log; -import android.util.Size; import androidx.annotation.Nullable; import java.io.ByteArrayOutputStream; import java.io.File; @@ -48,13 +48,13 @@ String resizeImageIfNeeded( try { String[] pathParts = imagePath.split("/"); String imageName = pathParts[pathParts.length - 1]; - Size size = + Point size = calculateSize( Double.valueOf(options.outWidth), Double.valueOf(options.outHeight), maxWidth, maxHeight); - options.inSampleSize = calculateInSampleSize(options, size.getWidth(), size.getHeight()); + options.inSampleSize = calculateInSampleSize(options, size.x, size.y); options.inJustDecodeBounds = false; File file = resizedImage( @@ -76,14 +76,14 @@ private File resizedImage( imageQuality = 100; } - Size size = calculateSize(originalWidth, originalHeight, maxWidth, maxHeight); - Bitmap scaledBmp = createScaledBitmap(bmp, size.getWidth(), size.getHeight(), false); + Point size = calculateSize(originalWidth, originalHeight, maxWidth, maxHeight); + Bitmap scaledBmp = createScaledBitmap(bmp, size.x, size.y, false); File file = createImageOnExternalDirectory("/scaled_" + outputImageName, scaledBmp, imageQuality); return file; } - private Size calculateSize( + private Point calculateSize( Double originalWidth, Double originalHeight, Double maxWidth, Double maxHeight) { boolean hasMaxWidth = maxWidth != null; boolean hasMaxHeight = maxHeight != null; @@ -120,7 +120,7 @@ private Size calculateSize( } } - return new Size(width.intValue(), height.intValue()); + return new Point(width.intValue(), height.intValue()); } private File createFile(File externalFilesDirectory, String child) { From dda55fe61e725925dd1efb43bb722f88ae44196b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Tue, 17 Jan 2023 19:39:38 -0300 Subject: [PATCH 08/15] Add tests --- .../image_picker_android/android/build.gradle | 2 +- .../plugins/imagepicker/ImageResizer.java | 13 ++++---- .../plugins/imagepicker/ImageResizerTest.java | 32 +++++++++++++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/build.gradle b/packages/image_picker/image_picker_android/android/build.gradle index aed1ad5174ea..fda2889ed6cb 100644 --- a/packages/image_picker/image_picker_android/android/build.gradle +++ b/packages/image_picker/image_picker_android/android/build.gradle @@ -39,7 +39,7 @@ android { implementation 'androidx.exifinterface:exifinterface:1.3.3' testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-core:4.8.0' + testImplementation 'org.mockito:mockito-inline:4.8.0' testImplementation 'androidx.test:core:1.4.0' testImplementation "org.robolectric:robolectric:4.8.1" } diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java index 620ce53f0cb3..9c230ed581d9 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java @@ -34,10 +34,10 @@ String resizeImageIfNeeded( @Nullable Double maxWidth, @Nullable Double maxHeight, @Nullable Integer imageQuality) { - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inJustDecodeBounds = true; - decodeFile(imagePath, options); - if (options.outWidth == -1 || options.outHeight == -1) { + BitmapFactory.Options queryOptions = new BitmapFactory.Options(); + queryOptions.inJustDecodeBounds = true; + decodeFile(imagePath, queryOptions); + if (queryOptions.outWidth == -1 || queryOptions.outHeight == -1) { return null; } boolean shouldScale = @@ -50,10 +50,11 @@ String resizeImageIfNeeded( String imageName = pathParts[pathParts.length - 1]; Point size = calculateSize( - Double.valueOf(options.outWidth), - Double.valueOf(options.outHeight), + Double.valueOf(queryOptions.outWidth), + Double.valueOf(queryOptions.outHeight), maxWidth, maxHeight); + BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = calculateInSampleSize(options, size.x, size.y); options.inJustDecodeBounds = false; File file = diff --git a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java index 73cfef9e88ea..c1845543f3d8 100644 --- a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java +++ b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java @@ -5,16 +5,25 @@ package io.flutter.plugins.imagepicker; import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.times; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import java.io.File; import java.io.IOException; +import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.MockedStatic; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; @@ -70,4 +79,27 @@ public void onResizeImageIfNeeded_WhenParentDirectoryDoesNotExists_ShouldNotCras String outoutFile = invalidResizer.resizeImageIfNeeded(imageFile.getPath(), null, 50.0, null); assertThat(outoutFile, equalTo(nonExistentDirectory.getPath() + "/scaled_pngImage.png")); } + + @Test + public void onResizeImageIfNeeded_WhenResizeIsNotNecessary_ShouldOnlyQueryBitmap() { + try (MockedStatic theMock = mockStatic(BitmapFactory.class, Mockito.CALLS_REAL_METHODS)) { + String outoutFile = resizer.resizeImageIfNeeded(imageFile.getPath(), null, null, null); + ArgumentCaptor argument = ArgumentCaptor.forClass(BitmapFactory.Options.class); + theMock.verify(() -> BitmapFactory.decodeFile(anyString(), argument.capture())); + BitmapFactory.Options capturedOptions = argument.getValue(); + assertTrue(capturedOptions.inJustDecodeBounds); + } + } + + @Test + public void onResizeImageIfNeeded_WhenResizeIsNecessary_ShouldAllocateBitmap() { + try (MockedStatic theMock = mockStatic(BitmapFactory.class, Mockito.CALLS_REAL_METHODS)) { + String outoutFile = resizer.resizeImageIfNeeded(imageFile.getPath(), 50.0, 50.0, null); + ArgumentCaptor argument = ArgumentCaptor.forClass(BitmapFactory.Options.class); + theMock.verify(() -> BitmapFactory.decodeFile(anyString(), argument.capture()), times(2)); + List capturedOptions = argument.getAllValues(); + assertTrue(capturedOptions.get(0).inJustDecodeBounds); + assertFalse(capturedOptions.get(1).inJustDecodeBounds); + } + } } From a7370a24f66fe3165dc297d84ded51b7241636cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Tue, 17 Jan 2023 19:45:12 -0300 Subject: [PATCH 09/15] Format code --- .../plugins/imagepicker/ImageResizerTest.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java index c1845543f3d8..30a9f67da128 100644 --- a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java +++ b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java @@ -82,9 +82,11 @@ public void onResizeImageIfNeeded_WhenParentDirectoryDoesNotExists_ShouldNotCras @Test public void onResizeImageIfNeeded_WhenResizeIsNotNecessary_ShouldOnlyQueryBitmap() { - try (MockedStatic theMock = mockStatic(BitmapFactory.class, Mockito.CALLS_REAL_METHODS)) { + try (MockedStatic theMock = + mockStatic(BitmapFactory.class, Mockito.CALLS_REAL_METHODS)) { String outoutFile = resizer.resizeImageIfNeeded(imageFile.getPath(), null, null, null); - ArgumentCaptor argument = ArgumentCaptor.forClass(BitmapFactory.Options.class); + ArgumentCaptor argument = + ArgumentCaptor.forClass(BitmapFactory.Options.class); theMock.verify(() -> BitmapFactory.decodeFile(anyString(), argument.capture())); BitmapFactory.Options capturedOptions = argument.getValue(); assertTrue(capturedOptions.inJustDecodeBounds); @@ -93,9 +95,11 @@ public void onResizeImageIfNeeded_WhenResizeIsNotNecessary_ShouldOnlyQueryBitmap @Test public void onResizeImageIfNeeded_WhenResizeIsNecessary_ShouldAllocateBitmap() { - try (MockedStatic theMock = mockStatic(BitmapFactory.class, Mockito.CALLS_REAL_METHODS)) { + try (MockedStatic theMock = + mockStatic(BitmapFactory.class, Mockito.CALLS_REAL_METHODS)) { String outoutFile = resizer.resizeImageIfNeeded(imageFile.getPath(), 50.0, 50.0, null); - ArgumentCaptor argument = ArgumentCaptor.forClass(BitmapFactory.Options.class); + ArgumentCaptor argument = + ArgumentCaptor.forClass(BitmapFactory.Options.class); theMock.verify(() -> BitmapFactory.decodeFile(anyString(), argument.capture()), times(2)); List capturedOptions = argument.getAllValues(); assertTrue(capturedOptions.get(0).inJustDecodeBounds); From eb6a70844cf7ef5bbed906816d2a563bd4fd1df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Tue, 17 Jan 2023 19:59:16 -0300 Subject: [PATCH 10/15] Revert to mockito-core --- packages/image_picker/image_picker_android/android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker_android/android/build.gradle b/packages/image_picker/image_picker_android/android/build.gradle index fda2889ed6cb..aed1ad5174ea 100644 --- a/packages/image_picker/image_picker_android/android/build.gradle +++ b/packages/image_picker/image_picker_android/android/build.gradle @@ -39,7 +39,7 @@ android { implementation 'androidx.exifinterface:exifinterface:1.3.3' testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-inline:4.8.0' + testImplementation 'org.mockito:mockito-core:4.8.0' testImplementation 'androidx.test:core:1.4.0' testImplementation "org.robolectric:robolectric:4.8.1" } From 419aebeda5737b92a3aa20a105637d36a5ad48f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Fri, 20 Jan 2023 15:56:44 -0300 Subject: [PATCH 11/15] Update version --- packages/image_picker/image_picker_android/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml index 461ddfc1c437..196e1c502c05 100755 --- a/packages/image_picker/image_picker_android/pubspec.yaml +++ b/packages/image_picker/image_picker_android/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_android description: Android implementation of the image_picker plugin. repository: https://github.com/flutter/plugins/tree/main/packages/image_picker/image_picker_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.8.5+5 +version: 0.8.5+6 environment: sdk: ">=2.14.0 <3.0.0" From 9fa95e669d517a4f8d47c78ef279b6aa96c5a844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Tue, 7 Feb 2023 10:24:50 -0300 Subject: [PATCH 12/15] Update version --- packages/image_picker/image_picker_android/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/image_picker/image_picker_android/CHANGELOG.md b/packages/image_picker/image_picker_android/CHANGELOG.md index 98789838973b..024c95bef88e 100644 --- a/packages/image_picker/image_picker_android/CHANGELOG.md +++ b/packages/image_picker/image_picker_android/CHANGELOG.md @@ -1,6 +1,9 @@ ## NEXT * Updates minimum Flutter version to 3.0. + +## 0.8.5+6 + * Improved Bitmap resizing. ## 0.8.5+5 From c5b7e6c8d0d8b30165992f0fdc010f1bb357abc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Sun, 12 Feb 2023 23:59:48 -0300 Subject: [PATCH 13/15] Update version config --- packages/image_picker/image_picker_android/CHANGELOG.md | 3 --- packages/image_picker/image_picker_android/pubspec.yaml | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/image_picker/image_picker_android/CHANGELOG.md b/packages/image_picker/image_picker_android/CHANGELOG.md index 024c95bef88e..98789838973b 100644 --- a/packages/image_picker/image_picker_android/CHANGELOG.md +++ b/packages/image_picker/image_picker_android/CHANGELOG.md @@ -1,9 +1,6 @@ ## NEXT * Updates minimum Flutter version to 3.0. - -## 0.8.5+6 - * Improved Bitmap resizing. ## 0.8.5+5 diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml index a0516685964c..7aa1a2258645 100755 --- a/packages/image_picker/image_picker_android/pubspec.yaml +++ b/packages/image_picker/image_picker_android/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_android description: Android implementation of the image_picker plugin. repository: https://github.com/flutter/plugins/tree/main/packages/image_picker/image_picker_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.8.5+6 +version: 0.8.5+5 environment: sdk: ">=2.14.0 <3.0.0" From b33531a819a3aec0caa88b8eeefc26af1d1116e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Mon, 13 Feb 2023 00:25:26 -0300 Subject: [PATCH 14/15] Update version info --- packages/image_picker/image_picker_android/CHANGELOG.md | 5 ++++- packages/image_picker/image_picker_android/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/image_picker_android/CHANGELOG.md b/packages/image_picker/image_picker_android/CHANGELOG.md index 351659534db4..fb4f49e4a969 100644 --- a/packages/image_picker/image_picker_android/CHANGELOG.md +++ b/packages/image_picker/image_picker_android/CHANGELOG.md @@ -1,8 +1,11 @@ +## 0.8.5+7 + +* Improved Bitmap resizing. + ## 0.8.5+6 * Updates minimum Flutter version to 3.0. * Fixes names of picked files to match original filenames where possible. -* Improved Bitmap resizing. ## 0.8.5+5 diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml index a0516685964c..b65a8ed0ee5e 100755 --- a/packages/image_picker/image_picker_android/pubspec.yaml +++ b/packages/image_picker/image_picker_android/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_android description: Android implementation of the image_picker plugin. repository: https://github.com/flutter/plugins/tree/main/packages/image_picker/image_picker_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.8.5+6 +version: 0.8.5+7 environment: sdk: ">=2.14.0 <3.0.0" From cf4c203b2527ab13bef7ec78132b9bb61d3f424c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sousa?= Date: Mon, 20 Feb 2023 23:02:11 -0300 Subject: [PATCH 15/15] Change mock variable name --- .../io/flutter/plugins/imagepicker/ImageResizerTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java index 30a9f67da128..312cffd74d92 100644 --- a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java +++ b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImageResizerTest.java @@ -82,12 +82,12 @@ public void onResizeImageIfNeeded_WhenParentDirectoryDoesNotExists_ShouldNotCras @Test public void onResizeImageIfNeeded_WhenResizeIsNotNecessary_ShouldOnlyQueryBitmap() { - try (MockedStatic theMock = + try (MockedStatic mockBitmapFactory = mockStatic(BitmapFactory.class, Mockito.CALLS_REAL_METHODS)) { String outoutFile = resizer.resizeImageIfNeeded(imageFile.getPath(), null, null, null); ArgumentCaptor argument = ArgumentCaptor.forClass(BitmapFactory.Options.class); - theMock.verify(() -> BitmapFactory.decodeFile(anyString(), argument.capture())); + mockBitmapFactory.verify(() -> BitmapFactory.decodeFile(anyString(), argument.capture())); BitmapFactory.Options capturedOptions = argument.getValue(); assertTrue(capturedOptions.inJustDecodeBounds); } @@ -95,12 +95,13 @@ public void onResizeImageIfNeeded_WhenResizeIsNotNecessary_ShouldOnlyQueryBitmap @Test public void onResizeImageIfNeeded_WhenResizeIsNecessary_ShouldAllocateBitmap() { - try (MockedStatic theMock = + try (MockedStatic mockBitmapFactory = mockStatic(BitmapFactory.class, Mockito.CALLS_REAL_METHODS)) { String outoutFile = resizer.resizeImageIfNeeded(imageFile.getPath(), 50.0, 50.0, null); ArgumentCaptor argument = ArgumentCaptor.forClass(BitmapFactory.Options.class); - theMock.verify(() -> BitmapFactory.decodeFile(anyString(), argument.capture()), times(2)); + mockBitmapFactory.verify( + () -> BitmapFactory.decodeFile(anyString(), argument.capture()), times(2)); List capturedOptions = argument.getAllValues(); assertTrue(capturedOptions.get(0).inJustDecodeBounds); assertFalse(capturedOptions.get(1).inJustDecodeBounds);