From 1e6fc2abd8ef5d2bcc086933d28da5c71cc73c6e Mon Sep 17 00:00:00 2001 From: Christopher Boyd Date: Mon, 28 Sep 2020 22:07:36 -0400 Subject: [PATCH 1/2] [image_picker] optionally disable PHAsset --- .../ios/Classes/FLTImagePickerPlugin.m | 20 ++++++++++++++++--- .../image_picker/lib/image_picker.dart | 8 ++++++++ .../lib/image_picker_for_web.dart | 1 + .../method_channel_image_picker.dart | 4 ++++ .../image_picker_platform.dart | 6 ++++++ 5 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m index 00fdec245aaf..0278837467fd 100644 --- a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m +++ b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m @@ -76,6 +76,7 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result _arguments = call.arguments; int imageSource = [[_arguments objectForKey:@"source"] intValue]; + BOOL usePhaAsset = [[_arguments objectForKey:@"iosPhaAsset"] boolValue]; switch (imageSource) { case SOURCE_CAMERA: { @@ -86,7 +87,11 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result break; } case SOURCE_GALLERY: - [self checkPhotoAuthorization]; + if (usePhaAsset) { + [self checkPhotoAuthorization]; + break; + } + [self showPhotoLibrary]; break; default: result([FlutterError errorWithCode:@"invalid_source" @@ -108,6 +113,7 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result _arguments = call.arguments; int imageSource = [[_arguments objectForKey:@"source"] intValue]; + BOOL usePhaAsset = [[_arguments objectForKey:@"iosPhaAsset"] boolValue]; if ([[_arguments objectForKey:@"maxDuration"] isKindOfClass:[NSNumber class]]) { NSTimeInterval max = [[_arguments objectForKey:@"maxDuration"] doubleValue]; _imagePickerController.videoMaximumDuration = max; @@ -118,7 +124,11 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result [self checkCameraAuthorization]; break; case SOURCE_GALLERY: - [self checkPhotoAuthorization]; + if (usePhaAsset) { + [self checkPhotoAuthorization]; + break; + } + [self showPhotoLibrary]; break; default: result([FlutterError errorWithCode:@"invalid_source" @@ -299,6 +309,7 @@ - (void)imagePickerController:(UIImagePickerController *)picker NSNumber *maxWidth = [_arguments objectForKey:@"maxWidth"]; NSNumber *maxHeight = [_arguments objectForKey:@"maxHeight"]; NSNumber *imageQuality = [_arguments objectForKey:@"imageQuality"]; + BOOL usePhaAsset = [[_arguments objectForKey:@"iosPhaAsset"] boolValue]; if (![imageQuality isKindOfClass:[NSNumber class]]) { imageQuality = @1; @@ -312,7 +323,10 @@ - (void)imagePickerController:(UIImagePickerController *)picker image = [FLTImagePickerImageUtil scaledImage:image maxWidth:maxWidth maxHeight:maxHeight]; } - PHAsset *originalAsset = [FLTImagePickerPhotoAssetUtil getAssetFromImagePickerInfo:info]; + PHAsset *originalAsset; + if (usePhaAsset) { + originalAsset = [FLTImagePickerPhotoAssetUtil getAssetFromImagePickerInfo:info]; + } if (!originalAsset) { // Image picked without an original asset (e.g. User took a photo directly) [self saveImageWithPickerInfo:info image:image imageQuality:imageQuality]; diff --git a/packages/image_picker/image_picker/lib/image_picker.dart b/packages/image_picker/image_picker/lib/image_picker.dart index ff9aa2cbecc3..d52276c6ab28 100755 --- a/packages/image_picker/image_picker/lib/image_picker.dart +++ b/packages/image_picker/image_picker/lib/image_picker.dart @@ -45,6 +45,8 @@ class ImagePicker { /// image types such as JPEG. If compression is not supported for the image that is picked, /// an warning message will be logged. /// + /// Set `iosPhaAsset` to `false` to disable `PHAAsset` and related permissions requirements on iOS. + /// /// Use `preferredCameraDevice` to specify the camera to use when the `source` is [ImageSource.camera]. /// The `preferredCameraDevice` is ignored when `source` is [ImageSource.gallery]. It is also ignored if the chosen camera is not supported on the device. /// Defaults to [CameraDevice.rear]. @@ -57,12 +59,14 @@ class ImagePicker { double maxWidth, double maxHeight, int imageQuality, + bool iosPhaAsset = true, CameraDevice preferredCameraDevice = CameraDevice.rear}) async { String path = await platform.pickImagePath( source: source, maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: imageQuality, + iosPhaAsset: iosPhaAsset, preferredCameraDevice: preferredCameraDevice, ); @@ -85,6 +89,8 @@ class ImagePicker { /// image types such as JPEG and on Android PNG and WebP, too. If compression is not supported for the image that is picked, /// a warning message will be logged. /// + /// Set `iosPhaAsset` to `false` to disable `PHAAsset` and related permissions requirements on iOS. + /// /// Use `preferredCameraDevice` to specify the camera to use when the `source` is [ImageSource.camera]. /// The `preferredCameraDevice` is ignored when `source` is [ImageSource.gallery]. It is also ignored if the chosen camera is not supported on the device. /// Defaults to [CameraDevice.rear]. Note that Android has no documented parameter for an intent to specify if @@ -98,6 +104,7 @@ class ImagePicker { double maxWidth, double maxHeight, int imageQuality, + bool iosPhaAsset = true, CameraDevice preferredCameraDevice = CameraDevice.rear, }) { return platform.pickImage( @@ -105,6 +112,7 @@ class ImagePicker { maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: imageQuality, + iosPhaAsset: iosPhaAsset, preferredCameraDevice: preferredCameraDevice, ); } diff --git a/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart b/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart index e50b4aad3c8d..373beb772c31 100644 --- a/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart +++ b/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart @@ -36,6 +36,7 @@ class ImagePickerPlugin extends ImagePickerPlatform { double maxWidth, double maxHeight, int imageQuality, + bool iosPhaAsset = true, CameraDevice preferredCameraDevice = CameraDevice.rear, }) { String capture = computeCaptureAttribute(source, preferredCameraDevice); diff --git a/packages/image_picker/image_picker_platform_interface/lib/src/method_channel/method_channel_image_picker.dart b/packages/image_picker/image_picker_platform_interface/lib/src/method_channel/method_channel_image_picker.dart index 71704b63ced4..95daca352686 100644 --- a/packages/image_picker/image_picker_platform_interface/lib/src/method_channel/method_channel_image_picker.dart +++ b/packages/image_picker/image_picker_platform_interface/lib/src/method_channel/method_channel_image_picker.dart @@ -25,6 +25,7 @@ class MethodChannelImagePicker extends ImagePickerPlatform { double maxWidth, double maxHeight, int imageQuality, + bool iosPhaAsset = true, CameraDevice preferredCameraDevice = CameraDevice.rear, }) async { String path = await pickImagePath( @@ -32,6 +33,7 @@ class MethodChannelImagePicker extends ImagePickerPlatform { maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: imageQuality, + iosPhaAsset: iosPhaAsset, preferredCameraDevice: preferredCameraDevice, ); return path != null ? PickedFile(path) : null; @@ -43,6 +45,7 @@ class MethodChannelImagePicker extends ImagePickerPlatform { double maxWidth, double maxHeight, int imageQuality, + bool iosPhaAsset = true, CameraDevice preferredCameraDevice = CameraDevice.rear, }) { assert(source != null); @@ -66,6 +69,7 @@ class MethodChannelImagePicker extends ImagePickerPlatform { 'maxWidth': maxWidth, 'maxHeight': maxHeight, 'imageQuality': imageQuality, + 'iosPhaAsset': iosPhaAsset, 'cameraDevice': preferredCameraDevice.index }, ); diff --git a/packages/image_picker/image_picker_platform_interface/lib/src/platform_interface/image_picker_platform.dart b/packages/image_picker/image_picker_platform_interface/lib/src/platform_interface/image_picker_platform.dart index f33c80bc4995..adeadb205a42 100644 --- a/packages/image_picker/image_picker_platform_interface/lib/src/platform_interface/image_picker_platform.dart +++ b/packages/image_picker/image_picker_platform_interface/lib/src/platform_interface/image_picker_platform.dart @@ -54,6 +54,8 @@ abstract class ImagePickerPlatform extends PlatformInterface { /// image types such as JPEG and on Android PNG and WebP, too. If compression is not supported for the image that is picked, /// a warning message will be logged. /// + /// Set `iosPhaAsset` to `false` to disable `PHAAsset` and related permissions requirements on iOS. + /// /// Use `preferredCameraDevice` to specify the camera to use when the `source` is [ImageSource.camera]. /// The `preferredCameraDevice` is ignored when `source` is [ImageSource.gallery]. It is also ignored if the chosen camera is not supported on the device. /// Defaults to [CameraDevice.rear]. @@ -66,6 +68,7 @@ abstract class ImagePickerPlatform extends PlatformInterface { double maxWidth, double maxHeight, int imageQuality, + bool iosPhaAsset = true, CameraDevice preferredCameraDevice = CameraDevice.rear, }) { throw UnimplementedError('legacyPickImage() has not been implemented.'); @@ -130,6 +133,8 @@ abstract class ImagePickerPlatform extends PlatformInterface { /// image types such as JPEG. If compression is not supported for the image that is picked, /// an warning message will be logged. /// + /// Set `iosPhaAsset` to `false` to disable `PHAAsset` and related permissions requirements on iOS. + /// /// Use `preferredCameraDevice` to specify the camera to use when the `source` is [ImageSource.camera]. /// The `preferredCameraDevice` is ignored when `source` is [ImageSource.gallery]. It is also ignored if the chosen camera is not supported on the device. /// Defaults to [CameraDevice.rear]. Note that Android has no documented parameter for an intent to specify if @@ -143,6 +148,7 @@ abstract class ImagePickerPlatform extends PlatformInterface { double maxWidth, double maxHeight, int imageQuality, + bool iosPhaAsset = true, CameraDevice preferredCameraDevice = CameraDevice.rear, }) { throw UnimplementedError('pickImage() has not been implemented.'); From 4a0a03e9852647e5c977de31839fd35a1f9129ba Mon Sep 17 00:00:00 2001 From: Christopher Boyd Date: Sun, 4 Oct 2020 23:56:14 -0400 Subject: [PATCH 2/2] [image_picker] update tests with iosPhaAsset --- .../image_picker/test/image_picker_test.dart | 29 +++++++++++++------ .../test/old_image_picker_test.dart | 29 +++++++++++++------ .../method_channel_image_picker_test.dart | 29 +++++++++++++------ .../new_method_channel_image_picker_test.dart | 29 +++++++++++++------ 4 files changed, 80 insertions(+), 36 deletions(-) diff --git a/packages/image_picker/image_picker/test/image_picker_test.dart b/packages/image_picker/image_picker/test/image_picker_test.dart index 0ada1b261363..4290748f931d 100644 --- a/packages/image_picker/image_picker/test/image_picker_test.dart +++ b/packages/image_picker/image_picker/test/image_picker_test.dart @@ -39,14 +39,16 @@ void main() { 'maxWidth': null, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 1, 'maxWidth': null, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), ], ); @@ -85,49 +87,56 @@ void main() { 'maxWidth': null, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': null, 'maxHeight': 10.0, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': 20.0, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': null, 'imageQuality': 70, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': null, 'maxHeight': 10.0, 'imageQuality': 70, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': 20.0, 'imageQuality': 70, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), ], ); @@ -164,6 +173,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'cameraDevice': 0, + 'iosPhaAsset': true, }), ], ); @@ -183,6 +193,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'cameraDevice': 1, + 'iosPhaAsset': true, }), ], ); diff --git a/packages/image_picker/image_picker/test/old_image_picker_test.dart b/packages/image_picker/image_picker/test/old_image_picker_test.dart index 8d4e068a261c..eacbd4744256 100644 --- a/packages/image_picker/image_picker/test/old_image_picker_test.dart +++ b/packages/image_picker/image_picker/test/old_image_picker_test.dart @@ -39,14 +39,16 @@ void main() { 'maxWidth': null, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 1, 'maxWidth': null, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), ], ); @@ -85,49 +87,56 @@ void main() { 'maxWidth': null, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': null, 'maxHeight': 10.0, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': 20.0, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': null, 'imageQuality': 70, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': null, 'maxHeight': 10.0, 'imageQuality': 70, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': 20.0, 'imageQuality': 70, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), ], ); @@ -165,6 +174,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'cameraDevice': 0, + 'iosPhaAsset': true, }), ], ); @@ -184,6 +194,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'cameraDevice': 1, + 'iosPhaAsset': true, }), ], ); diff --git a/packages/image_picker/image_picker_platform_interface/test/method_channel_image_picker_test.dart b/packages/image_picker/image_picker_platform_interface/test/method_channel_image_picker_test.dart index ddaad3d32f41..2e597571930b 100644 --- a/packages/image_picker/image_picker_platform_interface/test/method_channel_image_picker_test.dart +++ b/packages/image_picker/image_picker_platform_interface/test/method_channel_image_picker_test.dart @@ -38,14 +38,16 @@ void main() { 'maxWidth': null, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 1, 'maxWidth': null, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), ], ); @@ -84,49 +86,56 @@ void main() { 'maxWidth': null, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': null, 'maxHeight': 10.0, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': 20.0, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': null, 'imageQuality': 70, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': null, 'maxHeight': 10.0, 'imageQuality': 70, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': 20.0, 'imageQuality': 70, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), ], ); @@ -166,6 +175,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'cameraDevice': 0, + 'iosPhaAsset': true, }), ], ); @@ -185,6 +195,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'cameraDevice': 1, + 'iosPhaAsset': true, }), ], ); diff --git a/packages/image_picker/image_picker_platform_interface/test/new_method_channel_image_picker_test.dart b/packages/image_picker/image_picker_platform_interface/test/new_method_channel_image_picker_test.dart index e7abe37e4838..500944f37237 100644 --- a/packages/image_picker/image_picker_platform_interface/test/new_method_channel_image_picker_test.dart +++ b/packages/image_picker/image_picker_platform_interface/test/new_method_channel_image_picker_test.dart @@ -38,14 +38,16 @@ void main() { 'maxWidth': null, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 1, 'maxWidth': null, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), ], ); @@ -91,49 +93,56 @@ void main() { 'maxWidth': null, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': null, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': null, 'maxHeight': 10.0, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': 20.0, 'imageQuality': null, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': null, 'imageQuality': 70, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': null, 'maxHeight': 10.0, 'imageQuality': 70, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': 20.0, 'imageQuality': 70, - 'cameraDevice': 0 + 'cameraDevice': 0, + 'iosPhaAsset': true, }), ], ); @@ -171,6 +180,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'cameraDevice': 0, + 'iosPhaAsset': true, }), ], ); @@ -190,6 +200,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'cameraDevice': 1, + 'iosPhaAsset': true, }), ], );