Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/image_picker/image_picker_ios/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.8.6+1

* Fixes issue with crashing the app when picking images with PHPicker without providing `Photo Library Usage` permission.

## 0.8.6

* Adds `requestFullMetadata` option to `pickImage`, so images on iOS can be picked without `Photo Library Usage` permission.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ - (void)testSaveWebPImage API_AVAILABLE(ios(14)) {
PHPickerResult *result = [self createPickerResultWithProvider:itemProvider
withIdentifier:UTTypeWebP.identifier];

[self verifySavingImageWithPickerResult:result];
[self verifySavingImageWithPickerResult:result fullMetadata:YES];
}

- (void)testSavePNGImage API_AVAILABLE(ios(14)) {
Expand All @@ -32,7 +32,7 @@ - (void)testSavePNGImage API_AVAILABLE(ios(14)) {
PHPickerResult *result = [self createPickerResultWithProvider:itemProvider
withIdentifier:UTTypeWebP.identifier];

[self verifySavingImageWithPickerResult:result];
[self verifySavingImageWithPickerResult:result fullMetadata:YES];
}

- (void)testSaveJPGImage API_AVAILABLE(ios(14)) {
Expand All @@ -42,7 +42,7 @@ - (void)testSaveJPGImage API_AVAILABLE(ios(14)) {
PHPickerResult *result = [self createPickerResultWithProvider:itemProvider
withIdentifier:UTTypeWebP.identifier];

[self verifySavingImageWithPickerResult:result];
[self verifySavingImageWithPickerResult:result fullMetadata:YES];
}

- (void)testSaveGIFImage API_AVAILABLE(ios(14)) {
Expand All @@ -52,7 +52,21 @@ - (void)testSaveGIFImage API_AVAILABLE(ios(14)) {
PHPickerResult *result = [self createPickerResultWithProvider:itemProvider
withIdentifier:UTTypeWebP.identifier];

[self verifySavingImageWithPickerResult:result];
[self verifySavingImageWithPickerResult:result fullMetadata:YES];
}

- (void)testSavePNGImageWithoutFullMetadata API_AVAILABLE(ios(14)) {
id photoAssetUtil = OCMClassMock([PHAsset class]);

NSURL *imageURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"pngImage"
withExtension:@"png"];
NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithContentsOfURL:imageURL];
PHPickerResult *result = [self createPickerResultWithProvider:itemProvider
withIdentifier:UTTypeWebP.identifier];

[self verifySavingImageWithPickerResult:result fullMetadata:NO];
OCMVerify(times(0), [photoAssetUtil fetchAssetsWithLocalIdentifiers:[OCMArg any]
options:[OCMArg any]]);
}

/**
Expand All @@ -79,14 +93,16 @@ - (PHPickerResult *)createPickerResultWithProvider:(NSItemProvider *)itemProvide
*
* @param result the picker result
*/
- (void)verifySavingImageWithPickerResult:(PHPickerResult *)result API_AVAILABLE(ios(14)) {
- (void)verifySavingImageWithPickerResult:(PHPickerResult *)result
fullMetadata:(BOOL)fullMetadata API_AVAILABLE(ios(14)) {
XCTestExpectation *pathExpectation = [self expectationWithDescription:@"Path was created"];

FLTPHPickerSaveImageToPathOperation *operation = [[FLTPHPickerSaveImageToPathOperation alloc]
initWithResult:result
maxHeight:@100
maxWidth:@100
desiredImageQuality:@100
fullMetadata:fullMetadata
savedPathBlock:^(NSString *savedPath) {
if ([[NSFileManager defaultManager] fileExistsAtPath:savedPath]) {
[pathExpectation fulfill];
Expand Down
23 changes: 15 additions & 8 deletions packages/image_picker/image_picker_ios/example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -93,10 +93,15 @@ class _MyHomePageState extends State<MyHomePage> {
await _displayPickImageDialog(context!,
(double? maxWidth, double? maxHeight, int? quality) async {
try {
final List<XFile>? pickedFileList = await _picker.getMultiImage(
maxWidth: maxWidth,
maxHeight: maxHeight,
imageQuality: quality,
final List<XFile> pickedFileList =
await _picker.getMultiImageWithOptions(
options: MultiImagePickerOptions(
imageOptions: ImageOptions(
maxWidth: maxWidth,
maxHeight: maxHeight,
imageQuality: quality,
),
),
);
setState(() {
_imageFileList = pickedFileList;
Expand All @@ -111,11 +116,13 @@ class _MyHomePageState extends State<MyHomePage> {
await _displayPickImageDialog(context!,
(double? maxWidth, double? maxHeight, int? quality) async {
try {
final XFile? pickedFile = await _picker.getImage(
final XFile? pickedFile = await _picker.getImageFromSource(
source: source,
maxWidth: maxWidth,
maxHeight: maxHeight,
imageQuality: quality,
options: ImagePickerOptions(
maxWidth: maxWidth,
maxHeight: maxHeight,
imageQuality: quality,
),
);
setState(() {
_setImageFileListFromFile(pickedFile);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -490,14 +490,15 @@ - (void)picker:(PHPickerViewController *)picker

for (int i = 0; i < results.count; i++) {
PHPickerResult *result = results[i];
FLTPHPickerSaveImageToPathOperation *operation =
[[FLTPHPickerSaveImageToPathOperation alloc] initWithResult:result
maxHeight:maxHeight
maxWidth:maxWidth
desiredImageQuality:desiredImageQuality
savedPathBlock:^(NSString *savedPath) {
pathList[i] = savedPath;
}];
FLTPHPickerSaveImageToPathOperation *operation = [[FLTPHPickerSaveImageToPathOperation alloc]
initWithResult:result
maxHeight:maxHeight
maxWidth:maxWidth
desiredImageQuality:desiredImageQuality
fullMetadata:self.callContext.requestFullMetadata
savedPathBlock:^(NSString *savedPath) {
pathList[i] = savedPath;
}];
[operationQueue addOperation:operation];
}
[operationQueue waitUntilAllOperationsAreFinished];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
maxHeight:(NSNumber *)maxHeight
maxWidth:(NSNumber *)maxWidth
desiredImageQuality:(NSNumber *)desiredImageQuality
fullMetadata:(BOOL)fullMetadata
savedPathBlock:(void (^)(NSString *))savedPathBlock API_AVAILABLE(ios(14));

@end
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ @interface FLTPHPickerSaveImageToPathOperation ()
@property(assign, nonatomic) NSNumber *maxHeight;
@property(assign, nonatomic) NSNumber *maxWidth;
@property(assign, nonatomic) NSNumber *desiredImageQuality;
@property(assign, nonatomic) BOOL requestFullMetadata;

@end

Expand All @@ -28,13 +29,15 @@ - (instancetype)initWithResult:(PHPickerResult *)result
maxHeight:(NSNumber *)maxHeight
maxWidth:(NSNumber *)maxWidth
desiredImageQuality:(NSNumber *)desiredImageQuality
fullMetadata:(BOOL)fullMetadata
savedPathBlock:(GetSavedPath)savedPathBlock API_AVAILABLE(ios(14)) {
if (self = [super init]) {
if (result) {
self.result = result;
self.maxHeight = maxHeight;
self.maxWidth = maxWidth;
self.desiredImageQuality = desiredImageQuality;
self.requestFullMetadata = fullMetadata;
getSavedPath = savedPathBlock;
executing = NO;
finished = NO;
Expand Down Expand Up @@ -113,7 +116,10 @@ - (void)start {
* Processes the image.
*/
- (void)processImage:(UIImage *)localImage API_AVAILABLE(ios(14)) {
PHAsset *originalAsset = [FLTImagePickerPhotoAssetUtil getAssetFromPHPickerResult:self.result];
PHAsset *originalAsset;
if (self.requestFullMetadata) {
originalAsset = [FLTImagePickerPhotoAssetUtil getAssetFromPHPickerResult:self.result];
}

if (self.maxWidth != nil || self.maxHeight != nil) {
localImage = [FLTImagePickerImageUtil scaledImage:localImage
Expand Down
2 changes: 1 addition & 1 deletion packages/image_picker/image_picker_ios/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: image_picker_ios
description: iOS implementation of the image_picker plugin.
repository: https://github.com/flutter/plugins/tree/main/packages/image_picker/image_picker_ios
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22
version: 0.8.6
version: 0.8.6+1

environment:
sdk: ">=2.14.0 <3.0.0"
Expand Down