From 7be1c7cc9f79886756ed629ae5bd8012aabe4cd7 Mon Sep 17 00:00:00 2001 From: BeMacized Date: Fri, 21 May 2021 09:14:42 +0200 Subject: [PATCH 01/17] Switch to app-specific folder for writing camera captures. --- .../image_picker/android/src/main/AndroidManifest.xml | 11 +++++++---- .../plugins/imagepicker/ImagePickerPlugin.java | 4 +--- .../main/res/xml/flutter_image_picker_file_paths.xml | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml b/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml index f0bc86fbf0ac..1b136b4446e3 100755 --- a/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml +++ b/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml @@ -1,7 +1,10 @@ - - + package="io.flutter.plugins.imagepicker"> + + + + android:resource="@xml/flutter_image_picker_file_paths" /> \ No newline at end of file diff --git a/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index 98b64101bed7..601a539a2edc 100644 --- a/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -7,7 +7,6 @@ import android.app.Activity; import android.app.Application; import android.os.Bundle; -import android.os.Environment; import android.os.Handler; import android.os.Looper; import androidx.annotation.NonNull; @@ -219,8 +218,7 @@ private void tearDown() { private final ImagePickerDelegate constructDelegate(final Activity setupActivity) { final ImagePickerCache cache = new ImagePickerCache(setupActivity); - final File externalFilesDirectory = - setupActivity.getExternalFilesDir(Environment.DIRECTORY_PICTURES); + final File externalFilesDirectory = setupActivity.getCacheDir(); final ExifDataCopier exifDataCopier = new ExifDataCopier(); final ImageResizer imageResizer = new ImageResizer(externalFilesDirectory, exifDataCopier); return new ImagePickerDelegate(setupActivity, externalFilesDirectory, imageResizer, cache); diff --git a/packages/image_picker/image_picker/android/src/main/res/xml/flutter_image_picker_file_paths.xml b/packages/image_picker/image_picker/android/src/main/res/xml/flutter_image_picker_file_paths.xml index 4495c28c86d1..13dc42026c9c 100644 --- a/packages/image_picker/image_picker/android/src/main/res/xml/flutter_image_picker_file_paths.xml +++ b/packages/image_picker/image_picker/android/src/main/res/xml/flutter_image_picker_file_paths.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file From df306e2c7446be7db20b85c65deacd7dc4ecf37b Mon Sep 17 00:00:00 2001 From: BeMacized Date: Fri, 21 May 2021 09:54:09 +0200 Subject: [PATCH 02/17] Update documentation --- packages/image_picker/image_picker/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/image_picker/image_picker/README.md b/packages/image_picker/image_picker/README.md index ca8ad763c553..1de12bc556d9 100755 --- a/packages/image_picker/image_picker/README.md +++ b/packages/image_picker/image_picker/README.md @@ -19,12 +19,12 @@ Add the following keys to your _Info.plist_ file, located in `/ios ### Android -#### API < 29 No configuration required - the plugin should work out of the box. -#### API 29+ +It is no longer required to add `android:requestLegacyExternalStorage="true"` as an attribute to the `` tag in AndroidManifest.xml, as `image_picker` has been updated to make use of scoped storage. -Add `android:requestLegacyExternalStorage="true"` as an attribute to the `` tag in AndroidManifest.xml. The [attribute](https://developer.android.com/training/data-storage/compatibility) is `false` by default on apps targeting Android Q. +**Note:** Images and videos picked using the camera are saved to your application's local cache, and should therefore be expected to only be around temporarily. +If you require your picked image to be stored permanently, it is your responsibility to move it to a more permanent location. ### Example From 467bb5ce5a4276991843ce44f4667dbd97716301 Mon Sep 17 00:00:00 2001 From: BeMacized Date: Fri, 21 May 2021 12:23:30 +0200 Subject: [PATCH 03/17] Update targetSdkVersion for example. Update tests. --- .../imagepicker/ImagePickerDelegate.java | 2 +- .../plugins/imagepicker/ImagePickerPlugin.java | 3 ++- .../example/android/app/build.gradle | 4 ++-- .../imagepicker/ImagePickerPluginTest.java | 17 +++++++++++++++++ .../src/test/resources/robolectric.properties | 1 + 5 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties diff --git a/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index 29d7c8529a99..c273e0b04889 100644 --- a/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -86,7 +86,7 @@ public class ImagePickerDelegate @VisibleForTesting final String fileProviderName; private final Activity activity; - private final File externalFilesDirectory; + @VisibleForTesting final File externalFilesDirectory; private final ImageResizer imageResizer; private final ImagePickerCache cache; private final PermissionManager permissionManager; diff --git a/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index 601a539a2edc..bffc903b531e 100644 --- a/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -215,7 +215,8 @@ private void tearDown() { application = null; } - private final ImagePickerDelegate constructDelegate(final Activity setupActivity) { + @VisibleForTesting + final ImagePickerDelegate constructDelegate(final Activity setupActivity) { final ImagePickerCache cache = new ImagePickerCache(setupActivity); final File externalFilesDirectory = setupActivity.getCacheDir(); diff --git a/packages/image_picker/image_picker/example/android/app/build.gradle b/packages/image_picker/image_picker/example/android/app/build.gradle index 7b25d0746b86..f0b78a308459 100755 --- a/packages/image_picker/image_picker/example/android/app/build.gradle +++ b/packages/image_picker/image_picker/example/android/app/build.gradle @@ -35,7 +35,7 @@ android { defaultConfig { applicationId "io.flutter.plugins.imagepicker.example" minSdkVersion 16 - targetSdkVersion 28 + targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -60,7 +60,7 @@ flutter { dependencies { testImplementation 'junit:junit:4.12' - testImplementation 'org.mockito:mockito-core:2.17.0' + testImplementation 'org.mockito:mockito-core:2.28.2' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' testImplementation 'androidx.test:core:1.2.0' diff --git a/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java b/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java index 2e50a220c752..888ad5fa66fa 100644 --- a/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java +++ b/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java @@ -4,6 +4,8 @@ package io.flutter.plugins.imagepicker; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -15,6 +17,7 @@ import android.app.Application; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; +import java.io.File; import java.util.HashMap; import java.util.Map; import org.junit.Before; @@ -149,6 +152,20 @@ public void onConstructor_WhenContextTypeIsActivity_ShouldNotCrash() { "No exception thrown when ImagePickerPlugin() ran with context instanceof Activity", true); } + @Test + public void constructDelegate_ShouldUseInternalCacheDirectory() { + File mockDirectory = new File("/mockpath"); + when(mockActivity.getCacheDir()).thenReturn(mockDirectory); + + ImagePickerDelegate delegate = plugin.constructDelegate(mockActivity); + + verify(mockActivity).getCacheDir(); + assertThat( + "Delegate uses cache directory for storing camera captures", + delegate.externalFilesDirectory, + equalTo(mockDirectory)); + } + private MethodCall buildMethodCall(String method, final int source) { final Map arguments = new HashMap<>(); arguments.put("source", source); diff --git a/packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties b/packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties new file mode 100644 index 000000000000..d27d2bdc6e7c --- /dev/null +++ b/packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties @@ -0,0 +1 @@ +sdk=29 \ No newline at end of file From b2e902e4c0a8b913b1349ff330b7b8f963c483f8 Mon Sep 17 00:00:00 2001 From: BeMacized Date: Fri, 21 May 2021 12:27:01 +0200 Subject: [PATCH 04/17] Updated changelog and pubspec version --- packages/image_picker/image_picker/CHANGELOG.md | 6 ++++++ packages/image_picker/image_picker/pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index 4b8d35b46937..1bb05bdcd603 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.7.6 + +* Changed storage location for captured images and videos to internal cache on Android, +to comply with new Google Play storage requirements. +* Updated Mockito to fix Android tests. + ## 0.7.5+3 * Localize `UIAlertController` strings. diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index fecc40199abf..466615d940d4 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker description: Flutter plugin for selecting images from the Android and iOS image library, and taking new pictures with the camera. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker/image_picker -version: 0.7.5+3 +version: 0.7.6 flutter: plugin: From 84a5ad1793c248249b1ea116a80a5caede0a7cb6 Mon Sep 17 00:00:00 2001 From: Bodhi Mulders Date: Fri, 21 May 2021 14:49:44 +0200 Subject: [PATCH 05/17] Update packages/image_picker/image_picker/android/src/main/AndroidManifest.xml Co-authored-by: Maurits van Beusekom --- .../image_picker/android/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml b/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml index 1b136b4446e3..101dc1583953 100755 --- a/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml +++ b/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml @@ -17,4 +17,4 @@ android:resource="@xml/flutter_image_picker_file_paths" /> - \ No newline at end of file + From 46df81feaa66e9893d5a89c351fca4520dc61403 Mon Sep 17 00:00:00 2001 From: Bodhi Mulders Date: Fri, 21 May 2021 14:49:53 +0200 Subject: [PATCH 06/17] Update packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties Co-authored-by: Maurits van Beusekom --- .../android/app/src/test/resources/robolectric.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties b/packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties index d27d2bdc6e7c..3d78689f2988 100644 --- a/packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties +++ b/packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties @@ -1 +1 @@ -sdk=29 \ No newline at end of file +sdk=29 From 15d841d0c31ad52b4906ede18c47ca27e6cbaaf2 Mon Sep 17 00:00:00 2001 From: Bodhi Mulders Date: Fri, 21 May 2021 14:49:59 +0200 Subject: [PATCH 07/17] Update packages/image_picker/image_picker/android/src/main/res/xml/flutter_image_picker_file_paths.xml Co-authored-by: Maurits van Beusekom --- .../src/main/res/xml/flutter_image_picker_file_paths.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker/android/src/main/res/xml/flutter_image_picker_file_paths.xml b/packages/image_picker/image_picker/android/src/main/res/xml/flutter_image_picker_file_paths.xml index 13dc42026c9c..354418bd40ca 100644 --- a/packages/image_picker/image_picker/android/src/main/res/xml/flutter_image_picker_file_paths.xml +++ b/packages/image_picker/image_picker/android/src/main/res/xml/flutter_image_picker_file_paths.xml @@ -1,4 +1,4 @@ - \ No newline at end of file + From e1cb24e156f76e56303d4fecc247840c653e6a1f Mon Sep 17 00:00:00 2001 From: BeMacized Date: Fri, 21 May 2021 14:59:11 +0200 Subject: [PATCH 08/17] Implemented PR feedback --- .../image_picker/image_picker/example/android/app/build.gradle | 2 +- .../io/flutter/plugins/imagepicker/ImagePickerPluginTest.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/image_picker/example/android/app/build.gradle b/packages/image_picker/image_picker/example/android/app/build.gradle index f0b78a308459..f04d67d4eac1 100755 --- a/packages/image_picker/image_picker/example/android/app/build.gradle +++ b/packages/image_picker/image_picker/example/android/app/build.gradle @@ -35,7 +35,7 @@ android { defaultConfig { applicationId "io.flutter.plugins.imagepicker.example" minSdkVersion 16 - targetSdkVersion 30 + targetSdkVersion 28 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java b/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java index 888ad5fa66fa..a0ce87f4f2b7 100644 --- a/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java +++ b/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java @@ -9,6 +9,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; @@ -159,7 +160,7 @@ public void constructDelegate_ShouldUseInternalCacheDirectory() { ImagePickerDelegate delegate = plugin.constructDelegate(mockActivity); - verify(mockActivity).getCacheDir(); + verify(mockActivity, times(1)).getCacheDir(); assertThat( "Delegate uses cache directory for storing camera captures", delegate.externalFilesDirectory, From eafa0232eeeef8776a8aa794f80f197111b1a7fe Mon Sep 17 00:00:00 2001 From: BeMacized Date: Wed, 26 May 2021 07:47:11 +0200 Subject: [PATCH 09/17] Add test to check if file is created in cache directory --- .../example/android/app/build.gradle | 2 +- .../imagepicker/ImagePickerDelegateTest.java | 23 ++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/image_picker/example/android/app/build.gradle b/packages/image_picker/image_picker/example/android/app/build.gradle index f04d67d4eac1..cc77d33eed0d 100755 --- a/packages/image_picker/image_picker/example/android/app/build.gradle +++ b/packages/image_picker/image_picker/example/android/app/build.gradle @@ -60,7 +60,7 @@ flutter { dependencies { testImplementation 'junit:junit:4.12' - testImplementation 'org.mockito:mockito-core:2.28.2' + testImplementation 'org.mockito:mockito-core:3.10.0' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' testImplementation 'androidx.test:core:1.2.0' diff --git a/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java b/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java index a6858f2bd3b0..4e80f00ede4d 100644 --- a/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java +++ b/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java @@ -9,6 +9,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @@ -25,6 +26,8 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; public class ImagePickerDelegateTest { @@ -192,6 +195,24 @@ public void takeImageWithCamera_WhenCameraPermissionNotPresent_RequestsForPermis verifyNoMoreInteractions(mockResult); } + @Test + public void takeImageWithCamera_WritesImageToCacheDirectory() { + when(mockPermissionManager.isPermissionGranted(Manifest.permission.CAMERA)).thenReturn(true); + when(mockIntentResolver.resolveActivity(any(Intent.class))).thenReturn(true); + + MockedStatic mockStaticFile = Mockito.mockStatic(File.class); + mockStaticFile + .when(() -> File.createTempFile(any(), any(), any())) + .thenReturn(new File("/tmpfile")); + + ImagePickerDelegate delegate = createDelegate(); + delegate.takeImageWithCamera(mockMethodCall, mockResult); + + mockStaticFile.verify( + () -> File.createTempFile(any(), eq(".jpg"), eq(new File("/image_picker_cache"))), + times(1)); + } + @Test public void onRequestPermissionsResult_WhenReadExternalStoragePermissionDenied_FinishesWithError() { @@ -394,7 +415,7 @@ public void onActivityResult_WhenImageTakenWithCamera_AndNoResizeNeeded_Finishes private ImagePickerDelegate createDelegate() { return new ImagePickerDelegate( mockActivity, - null, + new File("/image_picker_cache"), mockImageResizer, null, null, From aa3c24d489fde7a7476b0e61b15ac45a188f9472 Mon Sep 17 00:00:00 2001 From: BeMacized Date: Wed, 26 May 2021 07:51:27 +0200 Subject: [PATCH 10/17] Upgrade PR to breaking change --- packages/image_picker/image_picker/CHANGELOG.md | 4 ++-- packages/image_picker/image_picker/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index 1bb05bdcd603..ea86bb0dc997 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,6 +1,6 @@ -## 0.7.6 +## 0.8.0 -* Changed storage location for captured images and videos to internal cache on Android, +* BREAKING CHANGE: Changed storage location for captured images and videos to internal cache on Android, to comply with new Google Play storage requirements. * Updated Mockito to fix Android tests. diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index 466615d940d4..a5daceeff59e 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker description: Flutter plugin for selecting images from the Android and iOS image library, and taking new pictures with the camera. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker/image_picker -version: 0.7.6 +version: 0.8.0 flutter: plugin: From a3c737c8bdd3f193f648f76cef60e3cba9bcd566 Mon Sep 17 00:00:00 2001 From: Bodhi Mulders Date: Wed, 26 May 2021 14:01:29 +0200 Subject: [PATCH 11/17] Update packages/image_picker/image_picker/CHANGELOG.md Co-authored-by: Maurits van Beusekom --- packages/image_picker/image_picker/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index ea86bb0dc997..6a4c015a3b2c 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,7 +1,7 @@ ## 0.8.0 * BREAKING CHANGE: Changed storage location for captured images and videos to internal cache on Android, -to comply with new Google Play storage requirements. +to comply with new Google Play storage requirements. This means developers are responsible for moving the image or video to a more permanent location when it is required to store the image or video permanently. * Updated Mockito to fix Android tests. ## 0.7.5+3 From bc3e4d588a231c0e99c7cfb850a28746c5c944bd Mon Sep 17 00:00:00 2001 From: Bodhi Mulders Date: Wed, 26 May 2021 14:06:29 +0200 Subject: [PATCH 12/17] Update CHANGELOG.md --- packages/image_picker/image_picker/CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index 6a4c015a3b2c..ec33b57b449e 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,7 +1,9 @@ ## 0.8.0 * BREAKING CHANGE: Changed storage location for captured images and videos to internal cache on Android, -to comply with new Google Play storage requirements. This means developers are responsible for moving the image or video to a more permanent location when it is required to store the image or video permanently. +to comply with new Google Play storage requirements. This means developers are responsible for moving +the image or video to a different location in case more permanent storage is required. Other applications +will no longer be able to access images or videos captured unless they are moved to a publicly accessible location. * Updated Mockito to fix Android tests. ## 0.7.5+3 From 114310822c2692a1e8b3497beca8fc4861147448 Mon Sep 17 00:00:00 2001 From: BeMacized Date: Wed, 26 May 2021 14:48:32 +0200 Subject: [PATCH 13/17] Removed redundant robolectric.properties --- .../android/app/src/test/resources/robolectric.properties | 1 - 1 file changed, 1 deletion(-) delete mode 100644 packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties diff --git a/packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties b/packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties deleted file mode 100644 index 3d78689f2988..000000000000 --- a/packages/image_picker/image_picker/example/android/app/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -sdk=29 From bfb2b6adf845a4813da3915d6a3d0c5e5aa70d9d Mon Sep 17 00:00:00 2001 From: BeMacized Date: Wed, 26 May 2021 17:24:24 +0200 Subject: [PATCH 14/17] Fix merge issue --- packages/image_picker/image_picker/pubspec.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index e88888198b58..95ea8086d52c 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -1,7 +1,6 @@ name: image_picker description: Flutter plugin for selecting images from the Android and iOS image library, and taking new pictures with the camera. -homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker/image_picker repository: https://github.com/flutter/plugins/tree/master/packages/image_picker/image_picker issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 version: 0.8.0 From e97335367fdb35b77a9a04bdd6f12e5619eeea8a Mon Sep 17 00:00:00 2001 From: BeMacized Date: Tue, 1 Jun 2021 12:31:58 +0200 Subject: [PATCH 15/17] Removed WRITE_EXTERNAL_STORAGE permission completely --- .../image_picker/android/src/main/AndroidManifest.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml b/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml index 101dc1583953..0b8457e40503 100755 --- a/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml +++ b/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml @@ -2,9 +2,6 @@ package="io.flutter.plugins.imagepicker"> - Date: Tue, 1 Jun 2021 13:05:59 +0200 Subject: [PATCH 16/17] Remove READ_EXTERNAL_STORAGE permission checks --- .../android/src/main/AndroidManifest.xml | 2 -- .../imagepicker/ImagePickerDelegate.java | 34 ++----------------- 2 files changed, 2 insertions(+), 34 deletions(-) diff --git a/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml b/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml index 0b8457e40503..5d1773ee03a4 100755 --- a/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml +++ b/packages/image_picker/image_picker/android/src/main/AndroidManifest.xml @@ -1,8 +1,6 @@ - - 2. Check that a required runtime permission has been granted. The chooseImageFromGallery() - * method checks if the {@link Manifest.permission#READ_EXTERNAL_STORAGE} permission has been - * granted. Similarly, the takeImageWithCamera() method checks that {@link - * Manifest.permission#CAMERA} has been granted. + *

2. Check that a required runtime permission has been granted. + * The takeImageWithCamera() method checks that {@link Manifest.permission#CAMERA} has been granted. * *

The permission check can end up in two different outcomes: * @@ -76,11 +74,9 @@ public class ImagePickerDelegate PluginRegistry.RequestPermissionsResultListener { @VisibleForTesting static final int REQUEST_CODE_CHOOSE_IMAGE_FROM_GALLERY = 2342; @VisibleForTesting static final int REQUEST_CODE_TAKE_IMAGE_WITH_CAMERA = 2343; - @VisibleForTesting static final int REQUEST_EXTERNAL_IMAGE_STORAGE_PERMISSION = 2344; @VisibleForTesting static final int REQUEST_CAMERA_IMAGE_PERMISSION = 2345; @VisibleForTesting static final int REQUEST_CODE_CHOOSE_VIDEO_FROM_GALLERY = 2352; @VisibleForTesting static final int REQUEST_CODE_TAKE_VIDEO_WITH_CAMERA = 2353; - @VisibleForTesting static final int REQUEST_EXTERNAL_VIDEO_STORAGE_PERMISSION = 2354; @VisibleForTesting static final int REQUEST_CAMERA_VIDEO_PERMISSION = 2355; @VisibleForTesting final String fileProviderName; @@ -257,12 +253,6 @@ public void chooseVideoFromGallery(MethodCall methodCall, MethodChannel.Result r return; } - if (!permissionManager.isPermissionGranted(Manifest.permission.READ_EXTERNAL_STORAGE)) { - permissionManager.askForPermission( - Manifest.permission.READ_EXTERNAL_STORAGE, REQUEST_EXTERNAL_VIDEO_STORAGE_PERMISSION); - return; - } - launchPickVideoFromGalleryIntent(); } @@ -322,12 +312,6 @@ public void chooseImageFromGallery(MethodCall methodCall, MethodChannel.Result r return; } - if (!permissionManager.isPermissionGranted(Manifest.permission.READ_EXTERNAL_STORAGE)) { - permissionManager.askForPermission( - Manifest.permission.READ_EXTERNAL_STORAGE, REQUEST_EXTERNAL_IMAGE_STORAGE_PERMISSION); - return; - } - launchPickImageFromGalleryIntent(); } @@ -424,16 +408,6 @@ public boolean onRequestPermissionsResult( grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED; switch (requestCode) { - case REQUEST_EXTERNAL_IMAGE_STORAGE_PERMISSION: - if (permissionGranted) { - launchPickImageFromGalleryIntent(); - } - break; - case REQUEST_EXTERNAL_VIDEO_STORAGE_PERMISSION: - if (permissionGranted) { - launchPickVideoFromGalleryIntent(); - } - break; case REQUEST_CAMERA_IMAGE_PERMISSION: if (permissionGranted) { launchTakeImageWithCameraIntent(); @@ -450,10 +424,6 @@ public boolean onRequestPermissionsResult( if (!permissionGranted) { switch (requestCode) { - case REQUEST_EXTERNAL_IMAGE_STORAGE_PERMISSION: - case REQUEST_EXTERNAL_VIDEO_STORAGE_PERMISSION: - finishWithError("photo_access_denied", "The user did not allow photo access."); - break; case REQUEST_CAMERA_IMAGE_PERMISSION: case REQUEST_CAMERA_VIDEO_PERMISSION: finishWithError("camera_access_denied", "The user did not allow camera access."); From fa3c577b71d94f6a8eb7930684eb0e4e16337bb9 Mon Sep 17 00:00:00 2001 From: BeMacized Date: Tue, 1 Jun 2021 13:31:01 +0200 Subject: [PATCH 17/17] Ran format and removed redundant unit tests --- .../imagepicker/ImagePickerDelegate.java | 4 +- .../imagepicker/ImagePickerDelegateTest.java | 58 ------------------- 2 files changed, 2 insertions(+), 60 deletions(-) diff --git a/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index 0ac65c75570a..c934b54a1f8e 100644 --- a/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -42,8 +42,8 @@ enum CameraDevice { * means that the chooseImageFromGallery() or takeImageWithCamera() method was called at least * twice. In this case, stop executing and finish with an error. * - *

2. Check that a required runtime permission has been granted. - * The takeImageWithCamera() method checks that {@link Manifest.permission#CAMERA} has been granted. + *

2. Check that a required runtime permission has been granted. The takeImageWithCamera() method + * checks that {@link Manifest.permission#CAMERA} has been granted. * *

The permission check can end up in two different outcomes: * diff --git a/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java b/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java index 4e80f00ede4d..da53b10b50f5 100644 --- a/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java +++ b/packages/image_picker/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java @@ -103,20 +103,6 @@ public void chooseImageFromGallery_WhenPendingResultExists_FinishesWithAlreadyAc verifyNoMoreInteractions(mockResult); } - @Test - public void chooseImageFromGallery_WhenHasNoExternalStoragePermission_RequestsForPermission() { - when(mockPermissionManager.isPermissionGranted(Manifest.permission.READ_EXTERNAL_STORAGE)) - .thenReturn(false); - - ImagePickerDelegate delegate = createDelegate(); - delegate.chooseImageFromGallery(mockMethodCall, mockResult); - - verify(mockPermissionManager) - .askForPermission( - Manifest.permission.READ_EXTERNAL_STORAGE, - ImagePickerDelegate.REQUEST_EXTERNAL_IMAGE_STORAGE_PERMISSION); - } - @Test public void chooseImageFromGallery_WhenHasExternalStoragePermission_LaunchesChooseFromGalleryIntent() { @@ -213,50 +199,6 @@ public void takeImageWithCamera_WritesImageToCacheDirectory() { times(1)); } - @Test - public void - onRequestPermissionsResult_WhenReadExternalStoragePermissionDenied_FinishesWithError() { - ImagePickerDelegate delegate = createDelegateWithPendingResultAndMethodCall(); - - delegate.onRequestPermissionsResult( - ImagePickerDelegate.REQUEST_EXTERNAL_IMAGE_STORAGE_PERMISSION, - new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, - new int[] {PackageManager.PERMISSION_DENIED}); - - verify(mockResult).error("photo_access_denied", "The user did not allow photo access.", null); - verifyNoMoreInteractions(mockResult); - } - - @Test - public void - onRequestChooseImagePermissionsResult_WhenReadExternalStorageGranted_LaunchesChooseImageFromGalleryIntent() { - ImagePickerDelegate delegate = createDelegateWithPendingResultAndMethodCall(); - - delegate.onRequestPermissionsResult( - ImagePickerDelegate.REQUEST_EXTERNAL_IMAGE_STORAGE_PERMISSION, - new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, - new int[] {PackageManager.PERMISSION_GRANTED}); - - verify(mockActivity) - .startActivityForResult( - any(Intent.class), eq(ImagePickerDelegate.REQUEST_CODE_CHOOSE_IMAGE_FROM_GALLERY)); - } - - @Test - public void - onRequestChooseVideoPermissionsResult_WhenReadExternalStorageGranted_LaunchesChooseVideoFromGalleryIntent() { - ImagePickerDelegate delegate = createDelegateWithPendingResultAndMethodCall(); - - delegate.onRequestPermissionsResult( - ImagePickerDelegate.REQUEST_EXTERNAL_VIDEO_STORAGE_PERMISSION, - new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, - new int[] {PackageManager.PERMISSION_GRANTED}); - - verify(mockActivity) - .startActivityForResult( - any(Intent.class), eq(ImagePickerDelegate.REQUEST_CODE_CHOOSE_VIDEO_FROM_GALLERY)); - } - @Test public void onRequestPermissionsResult_WhenCameraPermissionDenied_FinishesWithError() { ImagePickerDelegate delegate = createDelegateWithPendingResultAndMethodCall();