From 7b9470f9fa44b2211003dfbc6559e2312c51ec57 Mon Sep 17 00:00:00 2001 From: pdenert Date: Sun, 25 Feb 2024 03:11:39 +0100 Subject: [PATCH 01/45] Add limit to image_picker_platform_interface --- .../src/method_channel/method_channel_image_picker.dart | 8 ++++++++ .../lib/src/platform_interface/image_picker_platform.dart | 4 ++++ 2 files changed, 12 insertions(+) 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 943ea760995..a9cd8a5c924 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 @@ -40,11 +40,13 @@ class MethodChannelImagePicker extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) async { final List? paths = await _getMultiImagePath( maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: imageQuality, + limit: limit, ); if (paths == null) { return null; @@ -73,6 +75,10 @@ class MethodChannelImagePicker extends ImagePickerPlatform { throw ArgumentError.value(maxHeight, 'maxHeight', 'cannot be negative'); } + if (limit != null && limit < 1) { + throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); + } + return _channel.invokeMethod?>( 'pickMultiImage', { @@ -224,11 +230,13 @@ class MethodChannelImagePicker extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) async { final List? paths = await _getMultiImagePath( maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: imageQuality, + limit: limit, ); if (paths == null) { return null; 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 a31fbbab322..5fc1167cbd6 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 @@ -203,12 +203,15 @@ abstract class ImagePickerPlatform extends PlatformInterface { /// image types such as JPEG. If compression is not supported for the image that is picked, /// a warning message will be logged. /// + /// The `limit` argument defines how many images can be select. + /// /// If no images were picked, the return value is null. @Deprecated('Use getMultiImageWithOptions instead.') Future?> getMultiImage({ double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) { throw UnimplementedError('getMultiImage() has not been implemented.'); } @@ -318,6 +321,7 @@ abstract class ImagePickerPlatform extends PlatformInterface { maxWidth: options.imageOptions.maxWidth, maxHeight: options.imageOptions.maxHeight, imageQuality: options.imageOptions.imageQuality, + limit: options.limit, ); return pickedImages ?? []; } From 83ad65769190319eabfaba1298335708f05cebf2 Mon Sep 17 00:00:00 2001 From: pdenert Date: Sun, 25 Feb 2024 03:15:18 +0100 Subject: [PATCH 02/45] Add limit in getMultiImage and getMedia for android and ios --- .../image_picker/example/lib/main.dart | 31 ++-- .../image_picker/example/pubspec.yaml | 5 + .../image_picker/lib/image_picker.dart | 4 + .../image_picker/image_picker/pubspec.yaml | 5 + .../android/src/main/AndroidManifest.xml | 11 ++ .../imagepicker/ImagePickerDelegate.java | 22 ++- .../imagepicker/ImagePickerPlugin.java | 16 +- .../flutter/plugins/imagepicker/Messages.java | 118 +++++++------- .../example/lib/main.dart | 36 +++-- .../image_picker_android/example/pubspec.yaml | 5 + .../lib/image_picker_android.dart | 14 +- .../lib/src/messages.g.dart | 58 ++++--- .../pigeons/messages.dart | 3 +- .../image_picker_android/pubspec.yaml | 5 + .../image_picker_android/test/test_api.g.dart | 96 ++++------- .../image_picker_for_web/example/pubspec.yaml | 5 + .../lib/image_picker_for_web.dart | 4 + .../image_picker_for_web/pubspec.yaml | 5 + .../image_picker_ios/example/lib/main.dart | 57 ++++--- .../image_picker_ios/example/pubspec.yaml | 5 + .../ios/Classes/FLTImagePickerPlugin.m | 7 +- .../image_picker_ios/ios/Classes/messages.g.h | 51 +++--- .../image_picker_ios/ios/Classes/messages.g.m | 150 ++++++++---------- .../lib/image_picker_ios.dart | 19 ++- .../image_picker_ios/lib/src/messages.g.dart | 109 ++++++------- .../image_picker_ios/pigeons/messages.dart | 6 +- .../image_picker_ios/pubspec.yaml | 5 + .../test/image_picker_ios_test.dart | 2 + .../image_picker_ios/test/test_api.g.dart | 104 +++++------- .../image_picker_linux/example/pubspec.yaml | 5 + .../lib/image_picker_linux.dart | 7 +- .../image_picker_linux/pubspec.yaml | 5 + .../image_picker_macos/example/pubspec.yaml | 5 + .../lib/image_picker_macos.dart | 7 +- .../image_picker_macos/pubspec.yaml | 5 + .../image_picker_windows/example/pubspec.yaml | 5 + .../lib/image_picker_windows.dart | 7 +- .../image_picker_windows/pubspec.yaml | 5 + 38 files changed, 556 insertions(+), 453 deletions(-) diff --git a/packages/image_picker/image_picker/example/lib/main.dart b/packages/image_picker/image_picker/example/lib/main.dart index 2e1a3d720e2..a836c0a8433 100755 --- a/packages/image_picker/image_picker/example/lib/main.dart +++ b/packages/image_picker/image_picker/example/lib/main.dart @@ -56,6 +56,7 @@ class _MyHomePageState extends State { final TextEditingController maxWidthController = TextEditingController(); final TextEditingController maxHeightController = TextEditingController(); final TextEditingController qualityController = TextEditingController(); + final TextEditingController limitController = TextEditingController(); Future _playVideo(XFile? file) async { if (file != null && mounted) { @@ -96,19 +97,21 @@ class _MyHomePageState extends State { source: source, maxDuration: const Duration(seconds: 10)); await _playVideo(file); } else if (isMultiImage) { - await _displayPickImageDialog(context, - (double? maxWidth, double? maxHeight, int? quality) async { + await _displayPickImageDialog(context, true, (double? maxWidth, + double? maxHeight, int? quality, int? limit) async { try { final List pickedFileList = isMedia ? await _picker.pickMultipleMedia( maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: quality, + limit: limit, ) : await _picker.pickMultiImage( maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: quality, + limit: limit, ); setState(() { _mediaFileList = pickedFileList; @@ -120,8 +123,8 @@ class _MyHomePageState extends State { } }); } else if (isMedia) { - await _displayPickImageDialog(context, - (double? maxWidth, double? maxHeight, int? quality) async { + await _displayPickImageDialog(context, false, (double? maxWidth, + double? maxHeight, int? quality, int? limit) async { try { final List pickedFileList = []; final XFile? media = await _picker.pickMedia( @@ -142,8 +145,8 @@ class _MyHomePageState extends State { } }); } else { - await _displayPickImageDialog(context, - (double? maxWidth, double? maxHeight, int? quality) async { + await _displayPickImageDialog(context, false, (double? maxWidth, + double? maxHeight, int? quality, int? limit) async { try { final XFile? pickedFile = await _picker.pickImage( source: source, @@ -454,7 +457,7 @@ class _MyHomePageState extends State { } Future _displayPickImageDialog( - BuildContext context, OnPickImageCallback onPick) async { + BuildContext context, bool isMulti, OnPickImageCallback onPick) async { return showDialog( context: context, builder: (BuildContext context) { @@ -483,6 +486,13 @@ class _MyHomePageState extends State { decoration: const InputDecoration( hintText: 'Enter quality if desired'), ), + if (isMulti) + TextField( + controller: limitController, + keyboardType: TextInputType.number, + decoration: const InputDecoration( + hintText: 'Enter limit if desired'), + ), ], ), actions: [ @@ -504,7 +514,10 @@ class _MyHomePageState extends State { final int? quality = qualityController.text.isNotEmpty ? int.parse(qualityController.text) : null; - onPick(width, height, quality); + final int? limit = limitController.text.isNotEmpty + ? int.parse(limitController.text) + : null; + onPick(width, height, quality, limit); Navigator.of(context).pop(); }), ], @@ -514,7 +527,7 @@ class _MyHomePageState extends State { } typedef OnPickImageCallback = void Function( - double? maxWidth, double? maxHeight, int? quality); + double? maxWidth, double? maxHeight, int? quality, int? limit); class AspectRatioVideo extends StatefulWidget { const AspectRatioVideo(this.controller, {super.key}); diff --git a/packages/image_picker/image_picker/example/pubspec.yaml b/packages/image_picker/image_picker/example/pubspec.yaml index b41127efc89..6044ea4aabf 100644 --- a/packages/image_picker/image_picker/example/pubspec.yaml +++ b/packages/image_picker/image_picker/example/pubspec.yaml @@ -31,3 +31,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_android: {path: ../../../image_picker/image_picker_android}, image_picker_for_web: {path: ../../../image_picker/image_picker_for_web}, image_picker_ios: {path: ../../../image_picker/image_picker_ios}, image_picker_linux: {path: ../../../image_picker/image_picker_linux}, image_picker_macos: {path: ../../../image_picker/image_picker_macos}, image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}, image_picker_windows: {path: ../../../image_picker/image_picker_windows}} diff --git a/packages/image_picker/image_picker/lib/image_picker.dart b/packages/image_picker/image_picker/lib/image_picker.dart index 0ad4afc74ef..55ebd9fd3a3 100755 --- a/packages/image_picker/image_picker/lib/image_picker.dart +++ b/packages/image_picker/image_picker/lib/image_picker.dart @@ -128,6 +128,7 @@ class ImagePicker { double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, bool requestFullMetadata = true, }) { final ImageOptions imageOptions = ImageOptions.createAndValidate( @@ -140,6 +141,7 @@ class ImagePicker { return platform.getMultiImageWithOptions( options: MultiImagePickerOptions( imageOptions: imageOptions, + limit: limit, ), ); } @@ -239,6 +241,7 @@ class ImagePicker { double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, bool requestFullMetadata = true, }) { return platform.getMedia( @@ -250,6 +253,7 @@ class ImagePicker { imageQuality: imageQuality, requestFullMetadata: requestFullMetadata, ), + limit: limit, ), ); } diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index a0e3ce1dece..2d122e7321d 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -49,3 +49,8 @@ topics: - image-picker - files - file-selection + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_android: {path: ../../image_picker/image_picker_android}, image_picker_for_web: {path: ../../image_picker/image_picker_for_web}, image_picker_ios: {path: ../../image_picker/image_picker_ios}, image_picker_linux: {path: ../../image_picker/image_picker_linux}, image_picker_macos: {path: ../../image_picker/image_picker_macos}, image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}, image_picker_windows: {path: ../../image_picker/image_picker_windows}} diff --git a/packages/image_picker/image_picker_android/android/src/main/AndroidManifest.xml b/packages/image_picker/image_picker_android/android/src/main/AndroidManifest.xml index 5d1773ee03a..5f9bcd822e5 100755 --- a/packages/image_picker/image_picker_android/android/src/main/AndroidManifest.xml +++ b/packages/image_picker/image_picker_android/android/src/main/AndroidManifest.xml @@ -1,4 +1,5 @@ @@ -11,5 +12,15 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/flutter_image_picker_file_paths" /> + + + + + + + diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index 98b55608a75..7df56919dcc 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -6,6 +6,8 @@ import android.Manifest; import android.app.Activity; +import android.os.Bundle; +import android.os.ext.SdkExtensions; import android.content.ActivityNotFoundException; import android.content.ClipData; import android.content.Intent; @@ -297,8 +299,19 @@ private void launchPickMediaFromGalleryIntent(Messages.GeneralOptions generalOpt Intent pickMediaIntent; if (generalOptions.getUsePhotoPicker()) { if (generalOptions.getAllowMultiple()) { + Long limit = generalOptions.getLimit(); + int effectiveLimit; + + if (limit != null) { + effectiveLimit = Math.toIntExact(limit); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { + effectiveLimit = MediaStore.getPickImagesMaxLimit(); + } else { + effectiveLimit = Integer.MAX_VALUE; + } + pickMediaIntent = - new ActivityResultContracts.PickMultipleVisualMedia() + new ActivityResultContracts.PickMultipleVisualMedia(effectiveLimit) .createIntent( activity, new PickVisualMediaRequest.Builder() @@ -426,13 +439,14 @@ public void chooseImageFromGallery( public void chooseMultiImageFromGallery( @NonNull ImageSelectionOptions options, boolean usePhotoPicker, + int limit, @NonNull Messages.Result> result) { if (!setPendingOptionsAndResult(options, null, result)) { finishWithAlreadyActiveError(result); return; } - launchMultiPickImageFromGalleryIntent(usePhotoPicker); + launchMultiPickImageFromGalleryIntent(usePhotoPicker, limit); } private void launchPickImageFromGalleryIntent(Boolean usePhotoPicker) { @@ -452,11 +466,11 @@ private void launchPickImageFromGalleryIntent(Boolean usePhotoPicker) { activity.startActivityForResult(pickImageIntent, REQUEST_CODE_CHOOSE_IMAGE_FROM_GALLERY); } - private void launchMultiPickImageFromGalleryIntent(Boolean usePhotoPicker) { + private void launchMultiPickImageFromGalleryIntent(Boolean usePhotoPicker, int limit) { Intent pickMultiImageIntent; if (usePhotoPicker) { pickMultiImageIntent = - new ActivityResultContracts.PickMultipleVisualMedia() + new ActivityResultContracts.PickMultipleVisualMedia(limit) .createIntent( activity, new PickVisualMediaRequest.Builder() diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index b5deb289341..5cac836e0fc 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -6,7 +6,10 @@ import android.app.Activity; import android.app.Application; +import android.os.Build; import android.os.Bundle; +import android.os.ext.SdkExtensions; +import android.provider.MediaStore; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -317,7 +320,18 @@ public void pickImages( setCameraDevice(delegate, source); if (generalOptions.getAllowMultiple()) { - delegate.chooseMultiImageFromGallery(options, generalOptions.getUsePhotoPicker(), result); + Long limit = generalOptions.getLimit(); + int effectiveLimit; + + if (limit != null) { + effectiveLimit = Math.toIntExact(limit); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { + effectiveLimit = MediaStore.getPickImagesMaxLimit(); + } else { + effectiveLimit = Integer.MAX_VALUE; + } + + delegate.chooseMultiImageFromGallery(options, generalOptions.getUsePhotoPicker(), effectiveLimit, result); } else { switch (source.getType()) { case GALLERY: diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/Messages.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/Messages.java index 8a19cfd3c55..2d567d95edc 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/Messages.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/Messages.java @@ -16,7 +16,11 @@ import java.io.ByteArrayOutputStream; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** Generated class from Pigeon. */ @SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) @@ -31,7 +35,8 @@ public static class FlutterError extends RuntimeException { /** The error details. Must be a datatype supported by the api codec. */ public final Object details; - public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) { + public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) + { super(message); this.code = code; this.details = details; @@ -50,7 +55,7 @@ protected static ArrayList wrapError(@NonNull Throwable exception) { errorList.add(exception.toString()); errorList.add(exception.getClass().getSimpleName()); errorList.add( - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); } return errorList; } @@ -116,6 +121,16 @@ public void setUsePhotoPicker(@NonNull Boolean setterArg) { this.usePhotoPicker = setterArg; } + private @Nullable Long limit; + + public @Nullable Long getLimit() { + return limit; + } + + public void setLimit(@Nullable Long setterArg) { + this.limit = setterArg; + } + /** Constructor is non-public to enforce null safety; use Builder. */ GeneralOptions() {} @@ -135,19 +150,30 @@ public static final class Builder { return this; } + private @Nullable Long limit; + + public @NonNull Builder setLimit(@Nullable Long setterArg) { + this.limit = setterArg; + return this; + } + public @NonNull GeneralOptions build() { GeneralOptions pigeonReturn = new GeneralOptions(); pigeonReturn.setAllowMultiple(allowMultiple); pigeonReturn.setUsePhotoPicker(usePhotoPicker); + pigeonReturn.setLimit(limit); + System.out.println("text here"); + return pigeonReturn; } } @NonNull ArrayList toList() { - ArrayList toListResult = new ArrayList(2); + ArrayList toListResult = new ArrayList(3); toListResult.add(allowMultiple); toListResult.add(usePhotoPicker); + toListResult.add(limit); return toListResult; } @@ -157,6 +183,8 @@ ArrayList toList() { pigeonResult.setAllowMultiple((Boolean) allowMultiple); Object usePhotoPicker = list.get(1); pigeonResult.setUsePhotoPicker((Boolean) usePhotoPicker); + Object limit = list.get(2); + pigeonResult.setLimit((limit == null) ? null : ((limit instanceof Integer) ? (Integer) limit : (Long) limit)); return pigeonResult; } } @@ -164,7 +192,7 @@ ArrayList toList() { /** * Options for image selection and output. * - *

Generated class from Pigeon that represents data sent in messages. + * Generated class from Pigeon that represents data sent in messages. */ public static final class ImageSelectionOptions { /** If set, the max width that the image should be resized to fit in. */ @@ -192,7 +220,7 @@ public void setMaxHeight(@Nullable Double setterArg) { /** * The quality of the output image, from 0-100. * - *

100 indicates original quality. + * 100 indicates original quality. */ private @NonNull Long quality; @@ -258,10 +286,7 @@ ArrayList toList() { Object maxHeight = list.get(1); pigeonResult.setMaxHeight((Double) maxHeight); Object quality = list.get(2); - pigeonResult.setQuality( - (quality == null) - ? null - : ((quality instanceof Integer) ? (Integer) quality : (Long) quality)); + pigeonResult.setQuality((quality == null) ? null : ((quality instanceof Integer) ? (Integer) quality : (Long) quality)); return pigeonResult; } } @@ -310,10 +335,7 @@ ArrayList toList() { static @NonNull MediaSelectionOptions fromList(@NonNull ArrayList list) { MediaSelectionOptions pigeonResult = new MediaSelectionOptions(); Object imageSelectionOptions = list.get(0); - pigeonResult.setImageSelectionOptions( - (imageSelectionOptions == null) - ? null - : ImageSelectionOptions.fromList((ArrayList) imageSelectionOptions)); + pigeonResult.setImageSelectionOptions((imageSelectionOptions == null) ? null : ImageSelectionOptions.fromList((ArrayList) imageSelectionOptions)); return pigeonResult; } } @@ -321,7 +343,7 @@ ArrayList toList() { /** * Options for image selection and output. * - *

Generated class from Pigeon that represents data sent in messages. + * Generated class from Pigeon that represents data sent in messages. */ public static final class VideoSelectionOptions { /** The maximum desired length for the video, in seconds. */ @@ -361,12 +383,7 @@ ArrayList toList() { static @NonNull VideoSelectionOptions fromList(@NonNull ArrayList list) { VideoSelectionOptions pigeonResult = new VideoSelectionOptions(); Object maxDurationSeconds = list.get(0); - pigeonResult.setMaxDurationSeconds( - (maxDurationSeconds == null) - ? null - : ((maxDurationSeconds instanceof Integer) - ? (Integer) maxDurationSeconds - : (Long) maxDurationSeconds)); + pigeonResult.setMaxDurationSeconds((maxDurationSeconds == null) ? null : ((maxDurationSeconds instanceof Integer) ? (Integer) maxDurationSeconds : (Long) maxDurationSeconds)); return pigeonResult; } } @@ -374,7 +391,7 @@ ArrayList toList() { /** * Specification for the source of an image or video selection. * - *

Generated class from Pigeon that represents data sent in messages. + * Generated class from Pigeon that represents data sent in messages. */ public static final class SourceSpecification { private @NonNull SourceType type; @@ -448,9 +465,9 @@ ArrayList toList() { /** * An error that occurred during lost result retrieval. * - *

The data here maps to the `PlatformException` that will be created from it. + * The data here maps to the `PlatformException` that will be created from it. * - *

Generated class from Pigeon that represents data sent in messages. + * Generated class from Pigeon that represents data sent in messages. */ public static final class CacheRetrievalError { private @NonNull String code; @@ -524,7 +541,7 @@ ArrayList toList() { /** * The result of retrieving cached results from a previous run. * - *

Generated class from Pigeon that represents data sent in messages. + * Generated class from Pigeon that represents data sent in messages. */ public static final class CacheRetrievalResult { /** The type of the retrieved data. */ @@ -555,7 +572,7 @@ public void setError(@Nullable CacheRetrievalError setterArg) { /** * The results from the last selection, if any. * - *

Elements must not be null, by convention. See + * Elements must not be null, by convention. See * https://github.com/flutter/flutter/issues/97848 */ private @NonNull List paths; @@ -620,8 +637,7 @@ ArrayList toList() { Object type = list.get(0); pigeonResult.setType(type == null ? null : CacheRetrievalType.values()[(int) type]); Object error = list.get(1); - pigeonResult.setError( - (error == null) ? null : CacheRetrievalError.fromList((ArrayList) error)); + pigeonResult.setError((error == null) ? null : CacheRetrievalError.fromList((ArrayList) error)); Object paths = list.get(2); pigeonResult.setPaths((List) paths); return pigeonResult; @@ -696,53 +712,39 @@ public interface ImagePickerApi { /** * Selects images and returns their paths. * - *

Elements must not be null, by convention. See + * Elements must not be null, by convention. See * https://github.com/flutter/flutter/issues/97848 */ - void pickImages( - @NonNull SourceSpecification source, - @NonNull ImageSelectionOptions options, - @NonNull GeneralOptions generalOptions, - @NonNull Result> result); + void pickImages(@NonNull SourceSpecification source, @NonNull ImageSelectionOptions options, @NonNull GeneralOptions generalOptions, @NonNull Result> result); /** * Selects video and returns their paths. * - *

Elements must not be null, by convention. See + * Elements must not be null, by convention. See * https://github.com/flutter/flutter/issues/97848 */ - void pickVideos( - @NonNull SourceSpecification source, - @NonNull VideoSelectionOptions options, - @NonNull GeneralOptions generalOptions, - @NonNull Result> result); + void pickVideos(@NonNull SourceSpecification source, @NonNull VideoSelectionOptions options, @NonNull GeneralOptions generalOptions, @NonNull Result> result); /** * Selects images and videos and returns their paths. * - *

Elements must not be null, by convention. See + * Elements must not be null, by convention. See * https://github.com/flutter/flutter/issues/97848 */ - void pickMedia( - @NonNull MediaSelectionOptions mediaSelectionOptions, - @NonNull GeneralOptions generalOptions, - @NonNull Result> result); + void pickMedia(@NonNull MediaSelectionOptions mediaSelectionOptions, @NonNull GeneralOptions generalOptions, @NonNull Result> result); /** Returns results from a previous app session, if any. */ - @Nullable + @Nullable CacheRetrievalResult retrieveLostResults(); /** The codec used by ImagePickerApi. */ static @NonNull MessageCodec getCodec() { return ImagePickerApiCodec.INSTANCE; } - /** Sets up an instance of `ImagePickerApi` to handle messages through the `binaryMessenger`. */ + /**Sets up an instance of `ImagePickerApi` to handle messages through the `binaryMessenger`. */ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImagePickerApi api) { { BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.ImagePickerApi.pickImages", - getCodec(), - taskQueue); + binaryMessenger, "dev.flutter.pigeon.ImagePickerApi.pickImages", getCodec(), taskQueue); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -774,10 +776,7 @@ public void error(Throwable error) { BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.ImagePickerApi.pickVideos", - getCodec(), - taskQueue); + binaryMessenger, "dev.flutter.pigeon.ImagePickerApi.pickVideos", getCodec(), taskQueue); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -814,8 +813,7 @@ public void error(Throwable error) { (message, reply) -> { ArrayList wrapped = new ArrayList(); ArrayList args = (ArrayList) message; - MediaSelectionOptions mediaSelectionOptionsArg = - (MediaSelectionOptions) args.get(0); + MediaSelectionOptions mediaSelectionOptionsArg = (MediaSelectionOptions) args.get(0); GeneralOptions generalOptionsArg = (GeneralOptions) args.get(1); Result> resultCallback = new Result>() { @@ -840,10 +838,7 @@ public void error(Throwable error) { BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.ImagePickerApi.retrieveLostResults", - getCodec(), - taskQueue); + binaryMessenger, "dev.flutter.pigeon.ImagePickerApi.retrieveLostResults", getCodec(), taskQueue); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -851,7 +846,8 @@ public void error(Throwable error) { try { CacheRetrievalResult output = api.retrieveLostResults(); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } diff --git a/packages/image_picker/image_picker_android/example/lib/main.dart b/packages/image_picker/image_picker_android/example/lib/main.dart index 94cbd7dcc3a..8218f2d5ae2 100755 --- a/packages/image_picker/image_picker_android/example/lib/main.dart +++ b/packages/image_picker/image_picker_android/example/lib/main.dart @@ -74,6 +74,7 @@ class _MyHomePageState extends State { final TextEditingController maxWidthController = TextEditingController(); final TextEditingController maxHeightController = TextEditingController(); final TextEditingController qualityController = TextEditingController(); + final TextEditingController limitController = TextEditingController(); Future _playVideo(XFile? file) async { if (file != null && mounted) { @@ -109,8 +110,8 @@ class _MyHomePageState extends State { } await _playVideo(file); } else if (isMultiImage) { - await _displayPickImageDialog(context, - (double? maxWidth, double? maxHeight, int? quality) async { + await _displayPickImageDialog(context, true, (double? maxWidth, + double? maxHeight, int? quality, int? limit) async { try { final ImageOptions imageOptions = ImageOptions( maxWidth: maxWidth, @@ -120,12 +121,15 @@ class _MyHomePageState extends State { final List pickedFileList = isMedia ? await _picker.getMedia( options: MediaOptions( - allowMultiple: isMultiImage, - imageOptions: imageOptions), + allowMultiple: isMultiImage, + imageOptions: imageOptions, + limit: limit, + ), ) : await _picker.getMultiImageWithOptions( options: MultiImagePickerOptions( imageOptions: imageOptions, + limit: limit, ), ); if (pickedFileList.isNotEmpty && context.mounted) { @@ -141,8 +145,8 @@ class _MyHomePageState extends State { } }); } else if (isMedia) { - await _displayPickImageDialog(context, - (double? maxWidth, double? maxHeight, int? quality) async { + await _displayPickImageDialog(context, false, (double? maxWidth, + double? maxHeight, int? quality, int? limit) async { try { final List pickedFileList = []; final XFile? media = _firstOrNull(await _picker.getMedia( @@ -166,8 +170,8 @@ class _MyHomePageState extends State { } }); } else { - await _displayPickImageDialog(context, - (double? maxWidth, double? maxHeight, int? quality) async { + await _displayPickImageDialog(context, false, (double? maxWidth, + double? maxHeight, int? quality, int? limit) async { try { final XFile? pickedFile = await _picker.getImageFromSource( source: source, @@ -481,7 +485,7 @@ class _MyHomePageState extends State { } Future _displayPickImageDialog( - BuildContext context, OnPickImageCallback onPick) async { + BuildContext context, bool isMulti, OnPickImageCallback onPick) async { return showDialog( context: context, builder: (BuildContext context) { @@ -509,6 +513,13 @@ class _MyHomePageState extends State { decoration: const InputDecoration( hintText: 'Enter quality if desired'), ), + if (isMulti) + TextField( + controller: limitController, + keyboardType: TextInputType.number, + decoration: const InputDecoration( + hintText: 'Enter limit if desired'), + ), ], ), actions: [ @@ -530,7 +541,10 @@ class _MyHomePageState extends State { final int? quality = qualityController.text.isNotEmpty ? int.parse(qualityController.text) : null; - onPick(width, height, quality); + final int? limit = limitController.text.isNotEmpty + ? int.parse(limitController.text) + : null; + onPick(width, height, quality, limit); Navigator.of(context).pop(); }), ], @@ -547,7 +561,7 @@ class _MyHomePageState extends State { } typedef OnPickImageCallback = void Function( - double? maxWidth, double? maxHeight, int? quality); + double? maxWidth, double? maxHeight, int? quality, int? limit); class AspectRatioVideo extends StatefulWidget { const AspectRatioVideo(this.controller, {super.key}); diff --git a/packages/image_picker/image_picker_android/example/pubspec.yaml b/packages/image_picker/image_picker_android/example/pubspec.yaml index c2fa9e98131..22c838a79b5 100644 --- a/packages/image_picker/image_picker_android/example/pubspec.yaml +++ b/packages/image_picker/image_picker_android/example/pubspec.yaml @@ -33,3 +33,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_android: {path: ../../../image_picker/image_picker_android}, image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_android/lib/image_picker_android.dart b/packages/image_picker/image_picker_android/lib/image_picker_android.dart index c9e2c875e8b..6ee6dfa2dd8 100644 --- a/packages/image_picker/image_picker_android/lib/image_picker_android.dart +++ b/packages/image_picker/image_picker_android/lib/image_picker_android.dart @@ -50,11 +50,13 @@ class ImagePickerAndroid extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) async { final List paths = await _getMultiImagePath( maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: imageQuality, + limit: limit, ); if (paths.isEmpty) { return null; @@ -67,6 +69,7 @@ class ImagePickerAndroid extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) { if (imageQuality != null && (imageQuality < 0 || imageQuality > 100)) { throw ArgumentError.value( @@ -81,6 +84,10 @@ class ImagePickerAndroid extends ImagePickerPlatform { throw ArgumentError.value(maxHeight, 'maxHeight', 'cannot be negative'); } + if (limit != null && limit < 0) { + throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); + } + return _hostApi.pickImages( SourceSpecification(type: SourceType.gallery), ImageSelectionOptions( @@ -88,7 +95,9 @@ class ImagePickerAndroid extends ImagePickerPlatform { maxHeight: maxHeight, quality: imageQuality ?? 100), GeneralOptions( - allowMultiple: true, usePhotoPicker: useAndroidPhotoPicker), + allowMultiple: true, + usePhotoPicker: useAndroidPhotoPicker, + limit: limit), ); } @@ -196,11 +205,13 @@ class ImagePickerAndroid extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) async { final List paths = await _getMultiImagePath( maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: imageQuality, + limit: limit, ); if (paths.isEmpty) { return null; @@ -218,6 +229,7 @@ class ImagePickerAndroid extends ImagePickerPlatform { GeneralOptions( allowMultiple: options.allowMultiple, usePhotoPicker: useAndroidPhotoPicker, + limit: options.limit, ), )) .map((String? path) => XFile(path!)) diff --git a/packages/image_picker/image_picker_android/lib/src/messages.g.dart b/packages/image_picker/image_picker_android/lib/src/messages.g.dart index 476e80db001..e728ff2756b 100644 --- a/packages/image_picker/image_picker_android/lib/src/messages.g.dart +++ b/packages/image_picker/image_picker_android/lib/src/messages.g.dart @@ -30,16 +30,20 @@ class GeneralOptions { GeneralOptions({ required this.allowMultiple, required this.usePhotoPicker, + this.limit, }); bool allowMultiple; bool usePhotoPicker; + int? limit; + Object encode() { return [ allowMultiple, usePhotoPicker, + limit, ]; } @@ -48,6 +52,7 @@ class GeneralOptions { return GeneralOptions( allowMultiple: result[0]! as bool, usePhotoPicker: result[1]! as bool, + limit: result[2] as int?, ); } } @@ -105,8 +110,7 @@ class MediaSelectionOptions { static MediaSelectionOptions decode(Object result) { result as List; return MediaSelectionOptions( - imageSelectionOptions: - ImageSelectionOptions.decode(result[0]! as List), + imageSelectionOptions: ImageSelectionOptions.decode(result[0]! as List), ); } } @@ -156,7 +160,9 @@ class SourceSpecification { result as List; return SourceSpecification( type: SourceType.values[result[0]! as int], - camera: result[1] != null ? SourceCamera.values[result[1]! as int] : null, + camera: result[1] != null + ? SourceCamera.values[result[1]! as int] + : null, ); } } @@ -263,19 +269,19 @@ class _ImagePickerApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return CacheRetrievalError.decode(readValue(buffer)!); - case 129: + case 129: return CacheRetrievalResult.decode(readValue(buffer)!); - case 130: + case 130: return GeneralOptions.decode(readValue(buffer)!); - case 131: + case 131: return ImageSelectionOptions.decode(readValue(buffer)!); - case 132: + case 132: return MediaSelectionOptions.decode(readValue(buffer)!); - case 133: + case 133: return SourceSpecification.decode(readValue(buffer)!); - case 134: + case 134: return VideoSelectionOptions.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -297,16 +303,12 @@ class ImagePickerApi { /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickImages( - SourceSpecification arg_source, - ImageSelectionOptions arg_options, - GeneralOptions arg_generalOptions) async { + Future> pickImages(SourceSpecification arg_source, ImageSelectionOptions arg_options, GeneralOptions arg_generalOptions) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImagePickerApi.pickImages', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_source, arg_options, arg_generalOptions]) - as List?; + final List? replyList = + await channel.send([arg_source, arg_options, arg_generalOptions]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -332,16 +334,12 @@ class ImagePickerApi { /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickVideos( - SourceSpecification arg_source, - VideoSelectionOptions arg_options, - GeneralOptions arg_generalOptions) async { + Future> pickVideos(SourceSpecification arg_source, VideoSelectionOptions arg_options, GeneralOptions arg_generalOptions) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImagePickerApi.pickVideos', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_source, arg_options, arg_generalOptions]) - as List?; + final List? replyList = + await channel.send([arg_source, arg_options, arg_generalOptions]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -367,15 +365,12 @@ class ImagePickerApi { /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickMedia( - MediaSelectionOptions arg_mediaSelectionOptions, - GeneralOptions arg_generalOptions) async { + Future> pickMedia(MediaSelectionOptions arg_mediaSelectionOptions, GeneralOptions arg_generalOptions) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImagePickerApi.pickMedia', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_mediaSelectionOptions, arg_generalOptions]) - as List?; + final List? replyList = + await channel.send([arg_mediaSelectionOptions, arg_generalOptions]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -402,7 +397,8 @@ class ImagePickerApi { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImagePickerApi.retrieveLostResults', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel.send(null) as List?; + final List? replyList = + await channel.send(null) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', diff --git a/packages/image_picker/image_picker_android/pigeons/messages.dart b/packages/image_picker/image_picker_android/pigeons/messages.dart index 9d264b5a11f..7f39ae501b6 100644 --- a/packages/image_picker/image_picker_android/pigeons/messages.dart +++ b/packages/image_picker/image_picker_android/pigeons/messages.dart @@ -14,9 +14,10 @@ import 'package:pigeon/pigeon.dart'; copyrightHeader: 'pigeons/copyright.txt', )) class GeneralOptions { - GeneralOptions(this.allowMultiple, this.usePhotoPicker); + GeneralOptions(this.allowMultiple, this.usePhotoPicker, this.limit); bool allowMultiple; bool usePhotoPicker; + int? limit; } /// Options for image selection and output. diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml index 7a98a4f221f..b7b4a147fe3 100755 --- a/packages/image_picker/image_picker_android/pubspec.yaml +++ b/packages/image_picker/image_picker_android/pubspec.yaml @@ -34,3 +34,8 @@ topics: - image-picker - files - file-selection + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_android/test/test_api.g.dart b/packages/image_picker/image_picker_android/test/test_api.g.dart index d3b68913a68..1b8b1fa58b9 100644 --- a/packages/image_picker/image_picker_android/test/test_api.g.dart +++ b/packages/image_picker/image_picker_android/test/test_api.g.dart @@ -46,19 +46,19 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return CacheRetrievalError.decode(readValue(buffer)!); - case 129: + case 129: return CacheRetrievalResult.decode(readValue(buffer)!); - case 130: + case 130: return GeneralOptions.decode(readValue(buffer)!); - case 131: + case 131: return ImageSelectionOptions.decode(readValue(buffer)!); - case 132: + case 132: return MediaSelectionOptions.decode(readValue(buffer)!); - case 133: + case 133: return SourceSpecification.decode(readValue(buffer)!); - case 134: + case 134: return VideoSelectionOptions.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -67,64 +67,52 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { } abstract class TestHostImagePickerApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = _TestHostImagePickerApiCodec(); /// Selects images and returns their paths. /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickImages(SourceSpecification source, - ImageSelectionOptions options, GeneralOptions generalOptions); + Future> pickImages(SourceSpecification source, ImageSelectionOptions options, GeneralOptions generalOptions); /// Selects video and returns their paths. /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickVideos(SourceSpecification source, - VideoSelectionOptions options, GeneralOptions generalOptions); + Future> pickVideos(SourceSpecification source, VideoSelectionOptions options, GeneralOptions generalOptions); /// Selects images and videos and returns their paths. /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickMedia(MediaSelectionOptions mediaSelectionOptions, - GeneralOptions generalOptions); + Future> pickMedia(MediaSelectionOptions mediaSelectionOptions, GeneralOptions generalOptions); /// Returns results from a previous app session, if any. CacheRetrievalResult? retrieveLostResults(); - static void setup(TestHostImagePickerApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestHostImagePickerApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImagePickerApi.pickImages', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null.'); + 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null.'); final List args = (message as List?)!; - final SourceSpecification? arg_source = - (args[0] as SourceSpecification?); + final SourceSpecification? arg_source = (args[0] as SourceSpecification?); assert(arg_source != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null, expected non-null SourceSpecification.'); - final ImageSelectionOptions? arg_options = - (args[1] as ImageSelectionOptions?); + final ImageSelectionOptions? arg_options = (args[1] as ImageSelectionOptions?); assert(arg_options != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null, expected non-null ImageSelectionOptions.'); - final GeneralOptions? arg_generalOptions = - (args[2] as GeneralOptions?); + final GeneralOptions? arg_generalOptions = (args[2] as GeneralOptions?); assert(arg_generalOptions != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null, expected non-null GeneralOptions.'); - final List output = await api.pickImages( - arg_source!, arg_options!, arg_generalOptions!); + final List output = await api.pickImages(arg_source!, arg_options!, arg_generalOptions!); return [output]; }); } @@ -134,29 +122,22 @@ abstract class TestHostImagePickerApi { 'dev.flutter.pigeon.ImagePickerApi.pickVideos', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null.'); + 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null.'); final List args = (message as List?)!; - final SourceSpecification? arg_source = - (args[0] as SourceSpecification?); + final SourceSpecification? arg_source = (args[0] as SourceSpecification?); assert(arg_source != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null, expected non-null SourceSpecification.'); - final VideoSelectionOptions? arg_options = - (args[1] as VideoSelectionOptions?); + final VideoSelectionOptions? arg_options = (args[1] as VideoSelectionOptions?); assert(arg_options != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null, expected non-null VideoSelectionOptions.'); - final GeneralOptions? arg_generalOptions = - (args[2] as GeneralOptions?); + final GeneralOptions? arg_generalOptions = (args[2] as GeneralOptions?); assert(arg_generalOptions != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null, expected non-null GeneralOptions.'); - final List output = await api.pickVideos( - arg_source!, arg_options!, arg_generalOptions!); + final List output = await api.pickVideos(arg_source!, arg_options!, arg_generalOptions!); return [output]; }); } @@ -166,25 +147,19 @@ abstract class TestHostImagePickerApi { 'dev.flutter.pigeon.ImagePickerApi.pickMedia', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickMedia was null.'); + 'Argument for dev.flutter.pigeon.ImagePickerApi.pickMedia was null.'); final List args = (message as List?)!; - final MediaSelectionOptions? arg_mediaSelectionOptions = - (args[0] as MediaSelectionOptions?); + final MediaSelectionOptions? arg_mediaSelectionOptions = (args[0] as MediaSelectionOptions?); assert(arg_mediaSelectionOptions != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickMedia was null, expected non-null MediaSelectionOptions.'); - final GeneralOptions? arg_generalOptions = - (args[1] as GeneralOptions?); + final GeneralOptions? arg_generalOptions = (args[1] as GeneralOptions?); assert(arg_generalOptions != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickMedia was null, expected non-null GeneralOptions.'); - final List output = await api.pickMedia( - arg_mediaSelectionOptions!, arg_generalOptions!); + final List output = await api.pickMedia(arg_mediaSelectionOptions!, arg_generalOptions!); return [output]; }); } @@ -194,12 +169,9 @@ abstract class TestHostImagePickerApi { 'dev.flutter.pigeon.ImagePickerApi.retrieveLostResults', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { // ignore message final CacheRetrievalResult? output = api.retrieveLostResults(); return [output]; diff --git a/packages/image_picker/image_picker_for_web/example/pubspec.yaml b/packages/image_picker/image_picker_for_web/example/pubspec.yaml index f4f85645c58..8146fac14c3 100644 --- a/packages/image_picker/image_picker_for_web/example/pubspec.yaml +++ b/packages/image_picker/image_picker_for_web/example/pubspec.yaml @@ -18,3 +18,8 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_for_web: {path: ../../../image_picker/image_picker_for_web}, image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}} 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 0241e0750a7..775bad67085 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 @@ -199,12 +199,15 @@ class ImagePickerPlugin extends ImagePickerPlatform { } /// Injects a file input, and returns a list of XFile images that the user selected locally. + /// `limit` arguments is not currently supported. If these argument is supplied, + /// it will be silently ignored. @override @Deprecated('Use getMultiImageWithOptions instead.') Future> getMultiImage({ double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) async { return getMultiImageWithOptions( options: MultiImagePickerOptions( @@ -213,6 +216,7 @@ class ImagePickerPlugin extends ImagePickerPlatform { maxHeight: maxHeight, imageQuality: imageQuality, ), + limit: limit, ), ); } diff --git a/packages/image_picker/image_picker_for_web/pubspec.yaml b/packages/image_picker/image_picker_for_web/pubspec.yaml index 85567a58209..7eab0bc2ec2 100644 --- a/packages/image_picker/image_picker_for_web/pubspec.yaml +++ b/packages/image_picker/image_picker_for_web/pubspec.yaml @@ -34,3 +34,8 @@ topics: - image-picker - files - file-selection + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_ios/example/lib/main.dart b/packages/image_picker/image_picker_ios/example/lib/main.dart index 0f42b58ad2d..28d0ea2540e 100755 --- a/packages/image_picker/image_picker_ios/example/lib/main.dart +++ b/packages/image_picker/image_picker_ios/example/lib/main.dart @@ -56,6 +56,7 @@ class _MyHomePageState extends State { final TextEditingController maxWidthController = TextEditingController(); final TextEditingController maxHeightController = TextEditingController(); final TextEditingController qualityController = TextEditingController(); + final TextEditingController limitController = TextEditingController(); Future _playVideo(XFile? file) async { if (file != null && mounted) { @@ -88,18 +89,20 @@ class _MyHomePageState extends State { source: source, maxDuration: const Duration(seconds: 10)); await _playVideo(file); } else if (isMultiImage) { - await _displayPickImageDialog(context, - (double? maxWidth, double? maxHeight, int? quality) async { + await _displayPickImageDialog(context, true, (double? maxWidth, + double? maxHeight, int? quality, int? limit) async { try { final List pickedFileList = isMedia ? await _picker.getMedia( options: MediaOptions( - allowMultiple: isMultiImage, - imageOptions: ImageOptions( - maxWidth: maxWidth, - maxHeight: maxHeight, - imageQuality: quality, - )), + allowMultiple: isMultiImage, + imageOptions: ImageOptions( + maxWidth: maxWidth, + maxHeight: maxHeight, + imageQuality: quality, + ), + limit: limit, + ), ) : await _picker.getMultiImageWithOptions( options: MultiImagePickerOptions( @@ -108,6 +111,7 @@ class _MyHomePageState extends State { maxHeight: maxHeight, imageQuality: quality, ), + limit: limit, ), ); setState(() { @@ -120,18 +124,19 @@ class _MyHomePageState extends State { } }); } else if (isMedia) { - await _displayPickImageDialog(context, - (double? maxWidth, double? maxHeight, int? quality) async { + await _displayPickImageDialog(context, false, (double? maxWidth, + double? maxHeight, int? quality, int? limit) async { try { final List pickedFileList = []; final XFile? media = _firstOrNull(await _picker.getMedia( options: MediaOptions( - allowMultiple: isMultiImage, - imageOptions: ImageOptions( - maxWidth: maxWidth, - maxHeight: maxHeight, - imageQuality: quality, - )), + allowMultiple: isMultiImage, + imageOptions: ImageOptions( + maxWidth: maxWidth, + maxHeight: maxHeight, + imageQuality: quality, + ), + ), )); if (media != null) { @@ -145,8 +150,8 @@ class _MyHomePageState extends State { } }); } else { - await _displayPickImageDialog(context, - (double? maxWidth, double? maxHeight, int? quality) async { + await _displayPickImageDialog(context, false, (double? maxWidth, + double? maxHeight, int? quality, int? limit) async { try { final XFile? pickedFile = await _picker.getImageFromSource( source: source, @@ -400,7 +405,7 @@ class _MyHomePageState extends State { } Future _displayPickImageDialog( - BuildContext context, OnPickImageCallback onPick) async { + BuildContext context, bool isMulti, OnPickImageCallback onPick) async { return showDialog( context: context, builder: (BuildContext context) { @@ -428,6 +433,13 @@ class _MyHomePageState extends State { decoration: const InputDecoration( hintText: 'Enter quality if desired'), ), + if (isMulti) + TextField( + controller: limitController, + keyboardType: TextInputType.number, + decoration: const InputDecoration( + hintText: 'Enter limit if desired'), + ), ], ), actions: [ @@ -449,7 +461,10 @@ class _MyHomePageState extends State { final int? quality = qualityController.text.isNotEmpty ? int.parse(qualityController.text) : null; - onPick(width, height, quality); + final int? limit = limitController.text.isNotEmpty + ? int.parse(limitController.text) + : null; + onPick(width, height, quality, limit); Navigator.of(context).pop(); }), ], @@ -459,7 +474,7 @@ class _MyHomePageState extends State { } typedef OnPickImageCallback = void Function( - double? maxWidth, double? maxHeight, int? quality); + double? maxWidth, double? maxHeight, int? quality, int? limit); class AspectRatioVideo extends StatefulWidget { const AspectRatioVideo(this.controller, {super.key}); diff --git a/packages/image_picker/image_picker_ios/example/pubspec.yaml b/packages/image_picker/image_picker_ios/example/pubspec.yaml index e4dd0908f96..531dbb74121 100755 --- a/packages/image_picker/image_picker_ios/example/pubspec.yaml +++ b/packages/image_picker/image_picker_ios/example/pubspec.yaml @@ -28,3 +28,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_ios: {path: ../../../image_picker/image_picker_ios}, image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m b/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m index 10081a8c13e..70c6681b581 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m +++ b/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m @@ -190,6 +190,7 @@ - (void)pickImageWithSource:(nonnull FLTSourceSpecification *)source - (void)pickMultiImageWithMaxSize:(nonnull FLTMaxSize *)maxSize quality:(nullable NSNumber *)imageQuality fullMetadata:(BOOL)fullMetadata + limit:(nullable NSNumber *)limit completion:(nonnull void (^)(NSArray *_Nullable, FlutterError *_Nullable))completion { [self cancelInProgressCall]; @@ -198,7 +199,8 @@ - (void)pickMultiImageWithMaxSize:(nonnull FLTMaxSize *)maxSize context.maxSize = maxSize; context.imageQuality = imageQuality; context.requestFullMetadata = fullMetadata; - + context.maxImageCount = limit.intValue; + if (@available(iOS 14, *)) { [self launchPHPickerWithContext:context]; } else { @@ -219,8 +221,11 @@ - (void)pickMediaWithMediaSelectionOptions:(nonnull FLTMediaSelectionOptions *)m context.imageQuality = [mediaSelectionOptions imageQuality]; context.requestFullMetadata = [mediaSelectionOptions requestFullMetadata]; context.includeVideo = YES; + NSNumber *limit = [mediaSelectionOptions limit]; if (!mediaSelectionOptions.allowMultiple) { context.maxImageCount = 1; + } else if (limit != nil) { + context.maxImageCount = limit.intValue; } if (@available(iOS 14, *)) { diff --git a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h index 593f88296b8..22729da380e 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h +++ b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v13.0.0), do not edit directly. +// Autogenerated from Pigeon (v13.1.2), do not edit directly. // See also: https://pub.dev/packages/pigeon #import @@ -40,28 +40,32 @@ typedef NS_ENUM(NSUInteger, FLTSourceType) { @class FLTSourceSpecification; @interface FLTMaxSize : NSObject -+ (instancetype)makeWithWidth:(nullable NSNumber *)width height:(nullable NSNumber *)height; -@property(nonatomic, strong, nullable) NSNumber *width; -@property(nonatomic, strong, nullable) NSNumber *height; ++ (instancetype)makeWithWidth:(nullable NSNumber *)width + height:(nullable NSNumber *)height; +@property(nonatomic, strong, nullable) NSNumber * width; +@property(nonatomic, strong, nullable) NSNumber * height; @end @interface FLTMediaSelectionOptions : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; + (instancetype)makeWithMaxSize:(FLTMaxSize *)maxSize - imageQuality:(nullable NSNumber *)imageQuality - requestFullMetadata:(BOOL)requestFullMetadata - allowMultiple:(BOOL)allowMultiple; -@property(nonatomic, strong) FLTMaxSize *maxSize; -@property(nonatomic, strong, nullable) NSNumber *imageQuality; -@property(nonatomic, assign) BOOL requestFullMetadata; -@property(nonatomic, assign) BOOL allowMultiple; + imageQuality:(nullable NSNumber *)imageQuality + requestFullMetadata:(BOOL )requestFullMetadata + allowMultiple:(BOOL )allowMultiple + limit:(nullable NSNumber *)limit; +@property(nonatomic, strong) FLTMaxSize * maxSize; +@property(nonatomic, strong, nullable) NSNumber * imageQuality; +@property(nonatomic, assign) BOOL requestFullMetadata; +@property(nonatomic, assign) BOOL allowMultiple; +@property(nonatomic, strong, nullable) NSNumber * limit; @end @interface FLTSourceSpecification : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithType:(FLTSourceType)type camera:(FLTSourceCamera)camera; ++ (instancetype)makeWithType:(FLTSourceType)type + camera:(FLTSourceCamera)camera; @property(nonatomic, assign) FLTSourceType type; @property(nonatomic, assign) FLTSourceCamera camera; @end @@ -70,26 +74,13 @@ typedef NS_ENUM(NSUInteger, FLTSourceType) { NSObject *FLTImagePickerApiGetCodec(void); @protocol FLTImagePickerApi -- (void)pickImageWithSource:(FLTSourceSpecification *)source - maxSize:(FLTMaxSize *)maxSize - quality:(nullable NSNumber *)imageQuality - fullMetadata:(BOOL)requestFullMetadata - completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; -- (void)pickMultiImageWithMaxSize:(FLTMaxSize *)maxSize - quality:(nullable NSNumber *)imageQuality - fullMetadata:(BOOL)requestFullMetadata - completion:(void (^)(NSArray *_Nullable, - FlutterError *_Nullable))completion; -- (void)pickVideoWithSource:(FLTSourceSpecification *)source - maxDuration:(nullable NSNumber *)maxDurationSeconds - completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)pickImageWithSource:(FLTSourceSpecification *)source maxSize:(FLTMaxSize *)maxSize quality:(nullable NSNumber *)imageQuality fullMetadata:(BOOL)requestFullMetadata completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)pickMultiImageWithMaxSize:(FLTMaxSize *)maxSize quality:(nullable NSNumber *)imageQuality fullMetadata:(BOOL)requestFullMetadata limit:(nullable NSNumber *)limit completion:(void (^)(NSArray *_Nullable, FlutterError *_Nullable))completion; +- (void)pickVideoWithSource:(FLTSourceSpecification *)source maxDuration:(nullable NSNumber *)maxDurationSeconds completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; /// Selects images and videos and returns their paths. -- (void)pickMediaWithMediaSelectionOptions:(FLTMediaSelectionOptions *)mediaSelectionOptions - completion:(void (^)(NSArray *_Nullable, - FlutterError *_Nullable))completion; +- (void)pickMediaWithMediaSelectionOptions:(FLTMediaSelectionOptions *)mediaSelectionOptions completion:(void (^)(NSArray *_Nullable, FlutterError *_Nullable))completion; @end -extern void SetUpFLTImagePickerApi(id binaryMessenger, - NSObject *_Nullable api); +extern void SetUpFLTImagePickerApi(id binaryMessenger, NSObject *_Nullable api); NS_ASSUME_NONNULL_END diff --git a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m index 1659cb88703..1cc556fa8a4 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m +++ b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v13.0.0), do not edit directly. +// Autogenerated from Pigeon (v13.1.2), do not edit directly. // See also: https://pub.dev/packages/pigeon #import "messages.g.h" @@ -16,6 +16,20 @@ #error File requires ARC to be enabled. #endif +static NSArray *wrapResult(id result, FlutterError *error) { + if (error) { + return @[ + error.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null] + ]; + } + return @[ result ?: [NSNull null] ]; +} + +static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { + id result = array[key]; + return (result == [NSNull null]) ? nil : result; +} + @implementation FLTSourceCameraBox - (instancetype)initWithValue:(FLTSourceCamera)value { self = [super init]; @@ -36,19 +50,6 @@ - (instancetype)initWithValue:(FLTSourceType)value { } @end -static NSArray *wrapResult(id result, FlutterError *error) { - if (error) { - return @[ - error.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null] - ]; - } - return @[ result ?: [NSNull null] ]; -} -static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { - id result = array[key]; - return (result == [NSNull null]) ? nil : result; -} - @interface FLTMaxSize () + (FLTMaxSize *)fromList:(NSArray *)list; + (nullable FLTMaxSize *)nullableFromList:(NSArray *)list; @@ -68,8 +69,9 @@ - (NSArray *)toList; @end @implementation FLTMaxSize -+ (instancetype)makeWithWidth:(nullable NSNumber *)width height:(nullable NSNumber *)height { - FLTMaxSize *pigeonResult = [[FLTMaxSize alloc] init]; ++ (instancetype)makeWithWidth:(nullable NSNumber *)width + height:(nullable NSNumber *)height { + FLTMaxSize* pigeonResult = [[FLTMaxSize alloc] init]; pigeonResult.width = width; pigeonResult.height = height; return pigeonResult; @@ -93,14 +95,16 @@ - (NSArray *)toList { @implementation FLTMediaSelectionOptions + (instancetype)makeWithMaxSize:(FLTMaxSize *)maxSize - imageQuality:(nullable NSNumber *)imageQuality - requestFullMetadata:(BOOL)requestFullMetadata - allowMultiple:(BOOL)allowMultiple { - FLTMediaSelectionOptions *pigeonResult = [[FLTMediaSelectionOptions alloc] init]; + imageQuality:(nullable NSNumber *)imageQuality + requestFullMetadata:(BOOL )requestFullMetadata + allowMultiple:(BOOL )allowMultiple + limit:(nullable NSNumber *)limit { + FLTMediaSelectionOptions* pigeonResult = [[FLTMediaSelectionOptions alloc] init]; pigeonResult.maxSize = maxSize; pigeonResult.imageQuality = imageQuality; pigeonResult.requestFullMetadata = requestFullMetadata; pigeonResult.allowMultiple = allowMultiple; + pigeonResult.limit = limit; return pigeonResult; } + (FLTMediaSelectionOptions *)fromList:(NSArray *)list { @@ -109,6 +113,7 @@ + (FLTMediaSelectionOptions *)fromList:(NSArray *)list { pigeonResult.imageQuality = GetNullableObjectAtIndex(list, 1); pigeonResult.requestFullMetadata = [GetNullableObjectAtIndex(list, 2) boolValue]; pigeonResult.allowMultiple = [GetNullableObjectAtIndex(list, 3) boolValue]; + pigeonResult.limit = GetNullableObjectAtIndex(list, 4); return pigeonResult; } + (nullable FLTMediaSelectionOptions *)nullableFromList:(NSArray *)list { @@ -120,13 +125,15 @@ - (NSArray *)toList { self.imageQuality ?: [NSNull null], @(self.requestFullMetadata), @(self.allowMultiple), + self.limit ?: [NSNull null], ]; } @end @implementation FLTSourceSpecification -+ (instancetype)makeWithType:(FLTSourceType)type camera:(FLTSourceCamera)camera { - FLTSourceSpecification *pigeonResult = [[FLTSourceSpecification alloc] init]; ++ (instancetype)makeWithType:(FLTSourceType)type + camera:(FLTSourceCamera)camera { + FLTSourceSpecification* pigeonResult = [[FLTSourceSpecification alloc] init]; pigeonResult.type = type; pigeonResult.camera = camera; return pigeonResult; @@ -153,11 +160,11 @@ @interface FLTImagePickerApiCodecReader : FlutterStandardReader @implementation FLTImagePickerApiCodecReader - (nullable id)readValueOfType:(UInt8)type { switch (type) { - case 128: + case 128: return [FLTMaxSize fromList:[self readValue]]; - case 129: + case 129: return [FLTMediaSelectionOptions fromList:[self readValue]]; - case 130: + case 130: return [FLTSourceSpecification fromList:[self readValue]]; default: return [super readValueOfType:type]; @@ -199,91 +206,72 @@ - (FlutterStandardReader *)readerWithData:(NSData *)data { static FlutterStandardMessageCodec *sSharedObject = nil; static dispatch_once_t sPred = 0; dispatch_once(&sPred, ^{ - FLTImagePickerApiCodecReaderWriter *readerWriter = - [[FLTImagePickerApiCodecReaderWriter alloc] init]; + FLTImagePickerApiCodecReaderWriter *readerWriter = [[FLTImagePickerApiCodecReaderWriter alloc] init]; sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; }); return sSharedObject; } -void SetUpFLTImagePickerApi(id binaryMessenger, - NSObject *api) { +void SetUpFLTImagePickerApi(id binaryMessenger, NSObject *api) { { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage" + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector - (pickImageWithSource:maxSize:quality:fullMetadata:completion:)], - @"FLTImagePickerApi api (%@) doesn't respond to " - @"@selector(pickImageWithSource:maxSize:quality:fullMetadata:completion:)", - api); + NSCAssert([api respondsToSelector:@selector(pickImageWithSource:maxSize:quality:fullMetadata:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickImageWithSource:maxSize:quality:fullMetadata:completion:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTSourceSpecification *arg_source = GetNullableObjectAtIndex(args, 0); FLTMaxSize *arg_maxSize = GetNullableObjectAtIndex(args, 1); NSNumber *arg_imageQuality = GetNullableObjectAtIndex(args, 2); BOOL arg_requestFullMetadata = [GetNullableObjectAtIndex(args, 3) boolValue]; - [api pickImageWithSource:arg_source - maxSize:arg_maxSize - quality:arg_imageQuality - fullMetadata:arg_requestFullMetadata - completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickImageWithSource:arg_source maxSize:arg_maxSize quality:arg_imageQuality fullMetadata:arg_requestFullMetadata completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage" + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector - (pickMultiImageWithMaxSize:quality:fullMetadata:completion:)], - @"FLTImagePickerApi api (%@) doesn't respond to " - @"@selector(pickMultiImageWithMaxSize:quality:fullMetadata:completion:)", - api); + NSCAssert([api respondsToSelector:@selector(pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTMaxSize *arg_maxSize = GetNullableObjectAtIndex(args, 0); NSNumber *arg_imageQuality = GetNullableObjectAtIndex(args, 1); BOOL arg_requestFullMetadata = [GetNullableObjectAtIndex(args, 2) boolValue]; - [api pickMultiImageWithMaxSize:arg_maxSize - quality:arg_imageQuality - fullMetadata:arg_requestFullMetadata - completion:^(NSArray *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + NSNumber *arg_limit = GetNullableObjectAtIndex(args, 3); + [api pickMultiImageWithMaxSize:arg_maxSize quality:arg_imageQuality fullMetadata:arg_requestFullMetadata limit:arg_limit completion:^(NSArray *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo" + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pickVideoWithSource:maxDuration:completion:)], - @"FLTImagePickerApi api (%@) doesn't respond to " - @"@selector(pickVideoWithSource:maxDuration:completion:)", - api); + NSCAssert([api respondsToSelector:@selector(pickVideoWithSource:maxDuration:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickVideoWithSource:maxDuration:completion:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTSourceSpecification *arg_source = GetNullableObjectAtIndex(args, 0); NSNumber *arg_maxDurationSeconds = GetNullableObjectAtIndex(args, 1); - [api pickVideoWithSource:arg_source - maxDuration:arg_maxDurationSeconds - completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickVideoWithSource:arg_source maxDuration:arg_maxDurationSeconds completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; @@ -291,23 +279,19 @@ void SetUpFLTImagePickerApi(id binaryMessenger, } /// Selects images and videos and returns their paths. { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia" + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pickMediaWithMediaSelectionOptions:completion:)], - @"FLTImagePickerApi api (%@) doesn't respond to " - @"@selector(pickMediaWithMediaSelectionOptions:completion:)", - api); + NSCAssert([api respondsToSelector:@selector(pickMediaWithMediaSelectionOptions:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickMediaWithMediaSelectionOptions:completion:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTMediaSelectionOptions *arg_mediaSelectionOptions = GetNullableObjectAtIndex(args, 0); - [api pickMediaWithMediaSelectionOptions:arg_mediaSelectionOptions - completion:^(NSArray *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickMediaWithMediaSelectionOptions:arg_mediaSelectionOptions completion:^(NSArray *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; diff --git a/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart b/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart index 4c302cae5f1..b9a8c9239f1 100644 --- a/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart +++ b/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart @@ -87,6 +87,7 @@ class ImagePickerIOS extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) async { final List paths = await _pickMultiImageAsPath( options: MultiImagePickerOptions( @@ -95,6 +96,7 @@ class ImagePickerIOS extends ImagePickerPlatform { maxHeight: maxHeight, imageQuality: imageQuality, ), + limit: limit, ), ); // Convert an empty list to a null return since that was the legacy behavior @@ -133,12 +135,18 @@ class ImagePickerIOS extends ImagePickerPlatform { throw ArgumentError.value(maxHeight, 'maxHeight', 'cannot be negative'); } + final int? limit = options.limit; + if (limit != null && limit < 1) { + throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); + } + // TODO(stuartmorgan): Remove the cast once Pigeon supports non-nullable // generics, https://github.com/flutter/flutter/issues/97848 return (await _hostApi.pickMultiImage( MaxSize(width: maxWidth, height: maxHeight), imageQuality, - options.imageOptions.requestFullMetadata)) + options.imageOptions.requestFullMetadata, + limit)) .cast(); } @@ -210,11 +218,18 @@ class ImagePickerIOS extends ImagePickerPlatform { MediaOptions mediaOptions) { final MaxSize maxSize = _imageOptionsToMaxSizeWithValidation(mediaOptions.imageOptions); + + final int? limit = mediaOptions.limit; + if (limit != null && limit < 1) { + throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); + } + return MediaSelectionOptions( maxSize: maxSize, imageQuality: mediaOptions.imageOptions.imageQuality, requestFullMetadata: mediaOptions.imageOptions.requestFullMetadata, allowMultiple: mediaOptions.allowMultiple, + limit: mediaOptions.limit, ); } @@ -269,6 +284,7 @@ class ImagePickerIOS extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) async { final List paths = await _pickMultiImageAsPath( options: MultiImagePickerOptions( @@ -277,6 +293,7 @@ class ImagePickerIOS extends ImagePickerPlatform { maxHeight: maxHeight, imageQuality: imageQuality, ), + limit: limit, ), ); // Convert an empty list to a null return since that was the legacy behavior diff --git a/packages/image_picker/image_picker_ios/lib/src/messages.g.dart b/packages/image_picker/image_picker_ios/lib/src/messages.g.dart index 0ab7d1b5186..baa1f6582c5 100644 --- a/packages/image_picker/image_picker_ios/lib/src/messages.g.dart +++ b/packages/image_picker/image_picker_ios/lib/src/messages.g.dart @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v13.0.0), do not edit directly. +// Autogenerated from Pigeon (v13.1.2), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import @@ -11,15 +11,11 @@ import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer; import 'package:flutter/services.dart'; -List wrapResponse( - {Object? result, PlatformException? error, bool empty = false}) { - if (empty) { - return []; - } - if (error == null) { - return [result]; - } - return [error.code, error.message, error.details]; +PlatformException _createConnectionError(String channelName) { + return PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel: "$channelName".', + ); } enum SourceCamera { @@ -64,6 +60,7 @@ class MediaSelectionOptions { this.imageQuality, required this.requestFullMetadata, required this.allowMultiple, + this.limit, }); MaxSize maxSize; @@ -74,12 +71,15 @@ class MediaSelectionOptions { bool allowMultiple; + int? limit; + Object encode() { return [ maxSize.encode(), imageQuality, requestFullMetadata, allowMultiple, + limit, ]; } @@ -90,6 +90,7 @@ class MediaSelectionOptions { imageQuality: result[1] as int?, requestFullMetadata: result[2]! as bool, allowMultiple: result[3]! as bool, + limit: result[4] as int?, ); } } @@ -141,11 +142,11 @@ class _ImagePickerApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return MaxSize.decode(readValue(buffer)!); - case 129: + case 129: return MediaSelectionOptions.decode(readValue(buffer)!); - case 130: + case 130: return SourceSpecification.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -163,22 +164,17 @@ class ImagePickerApi { static const MessageCodec codec = _ImagePickerApiCodec(); - Future pickImage(SourceSpecification arg_source, MaxSize arg_maxSize, - int? arg_imageQuality, bool arg_requestFullMetadata) async { + Future pickImage(SourceSpecification arg_source, MaxSize arg_maxSize, int? arg_imageQuality, bool arg_requestFullMetadata) async { + const String channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage'; final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage', codec, - binaryMessenger: _binaryMessenger); - final List? replyList = await channel.send([ - arg_source, - arg_maxSize, - arg_imageQuality, - arg_requestFullMetadata - ]) as List?; + channelName, + codec, + binaryMessenger: _binaryMessenger, + ); + final List? replyList = + await channel.send([arg_source, arg_maxSize, arg_imageQuality, arg_requestFullMetadata]) as List?; if (replyList == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - ); + throw _createConnectionError(channelName); } else if (replyList.length > 1) { throw PlatformException( code: replyList[0]! as String, @@ -190,20 +186,17 @@ class ImagePickerApi { } } - Future> pickMultiImage(MaxSize arg_maxSize, - int? arg_imageQuality, bool arg_requestFullMetadata) async { + Future> pickMultiImage(MaxSize arg_maxSize, int? arg_imageQuality, bool arg_requestFullMetadata, int? arg_limit) async { + const String channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage'; final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage', - codec, - binaryMessenger: _binaryMessenger); - final List? replyList = await channel.send( - [arg_maxSize, arg_imageQuality, arg_requestFullMetadata]) - as List?; + channelName, + codec, + binaryMessenger: _binaryMessenger, + ); + final List? replyList = + await channel.send([arg_maxSize, arg_imageQuality, arg_requestFullMetadata, arg_limit]) as List?; if (replyList == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - ); + throw _createConnectionError(channelName); } else if (replyList.length > 1) { throw PlatformException( code: replyList[0]! as String, @@ -220,18 +213,17 @@ class ImagePickerApi { } } - Future pickVideo( - SourceSpecification arg_source, int? arg_maxDurationSeconds) async { + Future pickVideo(SourceSpecification arg_source, int? arg_maxDurationSeconds) async { + const String channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo'; final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo', codec, - binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_source, arg_maxDurationSeconds]) as List?; + channelName, + codec, + binaryMessenger: _binaryMessenger, + ); + final List? replyList = + await channel.send([arg_source, arg_maxDurationSeconds]) as List?; if (replyList == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - ); + throw _createConnectionError(channelName); } else if (replyList.length > 1) { throw PlatformException( code: replyList[0]! as String, @@ -244,18 +236,17 @@ class ImagePickerApi { } /// Selects images and videos and returns their paths. - Future> pickMedia( - MediaSelectionOptions arg_mediaSelectionOptions) async { + Future> pickMedia(MediaSelectionOptions arg_mediaSelectionOptions) async { + const String channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia'; final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia', codec, - binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_mediaSelectionOptions]) as List?; + channelName, + codec, + binaryMessenger: _binaryMessenger, + ); + final List? replyList = + await channel.send([arg_mediaSelectionOptions]) as List?; if (replyList == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - ); + throw _createConnectionError(channelName); } else if (replyList.length > 1) { throw PlatformException( code: replyList[0]! as String, diff --git a/packages/image_picker/image_picker_ios/pigeons/messages.dart b/packages/image_picker/image_picker_ios/pigeons/messages.dart index 0e69598304f..d8ae8954e98 100644 --- a/packages/image_picker/image_picker_ios/pigeons/messages.dart +++ b/packages/image_picker/image_picker_ios/pigeons/messages.dart @@ -26,12 +26,14 @@ class MediaSelectionOptions { this.imageQuality, required this.requestFullMetadata, required this.allowMultiple, + this.limit, }); MaxSize maxSize; int? imageQuality; bool requestFullMetadata; bool allowMultiple; + int? limit; } // Corresponds to `CameraDevice` from the platform interface package. @@ -53,9 +55,9 @@ abstract class ImagePickerApi { String? pickImage(SourceSpecification source, MaxSize maxSize, int? imageQuality, bool requestFullMetadata); @async - @ObjCSelector('pickMultiImageWithMaxSize:quality:fullMetadata:') + @ObjCSelector('pickMultiImageWithMaxSize:quality:fullMetadata:limit:') List pickMultiImage( - MaxSize maxSize, int? imageQuality, bool requestFullMetadata); + MaxSize maxSize, int? imageQuality, bool requestFullMetadata, int? limit); @async @ObjCSelector('pickVideoWithSource:maxDuration:') String? pickVideo(SourceSpecification source, int? maxDurationSeconds); diff --git a/packages/image_picker/image_picker_ios/pubspec.yaml b/packages/image_picker/image_picker_ios/pubspec.yaml index c1b3c8d6221..0de6ea9b25e 100755 --- a/packages/image_picker/image_picker_ios/pubspec.yaml +++ b/packages/image_picker/image_picker_ios/pubspec.yaml @@ -32,3 +32,8 @@ topics: - image-picker - files - file-selection + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart index 77fa322de6c..ba101341c8c 100644 --- a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart +++ b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart @@ -61,12 +61,14 @@ class _ApiLogger implements TestHostImagePickerApi { MaxSize maxSize, int? imageQuality, bool requestFullMetadata, + int? limit, ) async { calls.add(_LoggedMethodCall('pickMultiImage', arguments: { 'maxWidth': maxSize.width, 'maxHeight': maxSize.height, 'imageQuality': imageQuality, 'requestFullMetadata': requestFullMetadata, + 'limit': limit, })); return returnValue as List; } diff --git a/packages/image_picker/image_picker_ios/test/test_api.g.dart b/packages/image_picker/image_picker_ios/test/test_api.g.dart index a2d02666baa..1f5bb816932 100644 --- a/packages/image_picker/image_picker_ios/test/test_api.g.dart +++ b/packages/image_picker/image_picker_ios/test/test_api.g.dart @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v13.0.0), do not edit directly. +// Autogenerated from Pigeon (v13.1.2), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, unnecessary_import // ignore_for_file: avoid_relative_lib_imports @@ -34,11 +34,11 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return MaxSize.decode(readValue(buffer)!); - case 129: + case 129: return MediaSelectionOptions.decode(readValue(buffer)!); - case 130: + case 130: return SourceSpecification.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -47,40 +47,31 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { } abstract class TestHostImagePickerApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = _TestHostImagePickerApiCodec(); - Future pickImage(SourceSpecification source, MaxSize maxSize, - int? imageQuality, bool requestFullMetadata); + Future pickImage(SourceSpecification source, MaxSize maxSize, int? imageQuality, bool requestFullMetadata); - Future> pickMultiImage( - MaxSize maxSize, int? imageQuality, bool requestFullMetadata); + Future> pickMultiImage(MaxSize maxSize, int? imageQuality, bool requestFullMetadata, int? limit); - Future pickVideo( - SourceSpecification source, int? maxDurationSeconds); + Future pickVideo(SourceSpecification source, int? maxDurationSeconds); /// Selects images and videos and returns their paths. Future> pickMedia(MediaSelectionOptions mediaSelectionOptions); - static void setup(TestHostImagePickerApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestHostImagePickerApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null.'); final List args = (message as List?)!; - final SourceSpecification? arg_source = - (args[0] as SourceSpecification?); + final SourceSpecification? arg_source = (args[0] as SourceSpecification?); assert(arg_source != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null, expected non-null SourceSpecification.'); final MaxSize? arg_maxSize = (args[1] as MaxSize?); @@ -91,32 +82,26 @@ abstract class TestHostImagePickerApi { assert(arg_requestFullMetadata != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null, expected non-null bool.'); try { - final String? output = await api.pickImage(arg_source!, - arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!); + final String? output = await api.pickImage(arg_source!, arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage', - codec, + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage was null.'); final List args = (message as List?)!; final MaxSize? arg_maxSize = (args[0] as MaxSize?); assert(arg_maxSize != null, @@ -125,15 +110,14 @@ abstract class TestHostImagePickerApi { final bool? arg_requestFullMetadata = (args[2] as bool?); assert(arg_requestFullMetadata != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage was null, expected non-null bool.'); + final int? arg_limit = (args[3] as int?); try { - final List output = await api.pickMultiImage( - arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!); + final List output = await api.pickMultiImage(arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!, arg_limit); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } @@ -143,29 +127,23 @@ abstract class TestHostImagePickerApi { 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo was null.'); final List args = (message as List?)!; - final SourceSpecification? arg_source = - (args[0] as SourceSpecification?); + final SourceSpecification? arg_source = (args[0] as SourceSpecification?); assert(arg_source != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo was null, expected non-null SourceSpecification.'); final int? arg_maxDurationSeconds = (args[1] as int?); try { - final String? output = - await api.pickVideo(arg_source!, arg_maxDurationSeconds); + final String? output = await api.pickVideo(arg_source!, arg_maxDurationSeconds); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } @@ -175,28 +153,22 @@ abstract class TestHostImagePickerApi { 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia was null.'); final List args = (message as List?)!; - final MediaSelectionOptions? arg_mediaSelectionOptions = - (args[0] as MediaSelectionOptions?); + final MediaSelectionOptions? arg_mediaSelectionOptions = (args[0] as MediaSelectionOptions?); assert(arg_mediaSelectionOptions != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia was null, expected non-null MediaSelectionOptions.'); try { - final List output = - await api.pickMedia(arg_mediaSelectionOptions!); + final List output = await api.pickMedia(arg_mediaSelectionOptions!); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } diff --git a/packages/image_picker/image_picker_linux/example/pubspec.yaml b/packages/image_picker/image_picker_linux/example/pubspec.yaml index a49e487d243..ac97ca436c2 100644 --- a/packages/image_picker/image_picker_linux/example/pubspec.yaml +++ b/packages/image_picker/image_picker_linux/example/pubspec.yaml @@ -27,3 +27,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_linux: {path: ../../../image_picker/image_picker_linux}, image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_linux/lib/image_picker_linux.dart b/packages/image_picker/image_picker_linux/lib/image_picker_linux.dart index 72596ea931f..e73e1ff4563 100644 --- a/packages/image_picker/image_picker_linux/lib/image_picker_linux.dart +++ b/packages/image_picker/image_picker_linux/lib/image_picker_linux.dart @@ -139,14 +139,15 @@ class ImagePickerLinux extends CameraDelegatingImagePickerPlatform { throw UnimplementedError('Unknown ImageSource: $source'); } - // `maxWidth`, `maxHeight`, and `imageQuality` arguments are not currently - // supported. If any of these arguments are supplied, they will be silently - // ignored. + // `maxWidth`, `maxHeight`, `imageQuality`, and `limit` arguments are not + // currently supported. If any of these arguments are supplied, they will + // be silently ignored. @override Future> getMultiImage({ double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) async { const XTypeGroup typeGroup = XTypeGroup(label: 'Images', mimeTypes: ['image/*']); diff --git a/packages/image_picker/image_picker_linux/pubspec.yaml b/packages/image_picker/image_picker_linux/pubspec.yaml index 5be7f927eec..9e0ad116044 100644 --- a/packages/image_picker/image_picker_linux/pubspec.yaml +++ b/packages/image_picker/image_picker_linux/pubspec.yaml @@ -32,3 +32,8 @@ topics: - image-picker - files - file-selection + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_macos/example/pubspec.yaml b/packages/image_picker/image_picker_macos/example/pubspec.yaml index cff5501cfa2..d0c84499a22 100644 --- a/packages/image_picker/image_picker_macos/example/pubspec.yaml +++ b/packages/image_picker/image_picker_macos/example/pubspec.yaml @@ -27,3 +27,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_macos: {path: ../../../image_picker/image_picker_macos}, image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_macos/lib/image_picker_macos.dart b/packages/image_picker/image_picker_macos/lib/image_picker_macos.dart index 9e9447a5710..028fa50d16e 100644 --- a/packages/image_picker/image_picker_macos/lib/image_picker_macos.dart +++ b/packages/image_picker/image_picker_macos/lib/image_picker_macos.dart @@ -141,14 +141,15 @@ class ImagePickerMacOS extends CameraDelegatingImagePickerPlatform { throw UnimplementedError('Unknown ImageSource: $source'); } - // `maxWidth`, `maxHeight`, and `imageQuality` arguments are not currently - // supported. If any of these arguments are supplied, they will be silently - // ignored. + // `maxWidth`, `maxHeight`, `imageQuality`, and `limit` arguments are not + // currently supported. If any of these arguments are supplied, they will + // be silently ignored. @override Future> getMultiImage({ double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) async { // TODO(stuartmorgan): Add a native implementation that can use // PHPickerViewController on macOS 13+, with this as a fallback for diff --git a/packages/image_picker/image_picker_macos/pubspec.yaml b/packages/image_picker/image_picker_macos/pubspec.yaml index 5fc9563c02b..70217d847be 100644 --- a/packages/image_picker/image_picker_macos/pubspec.yaml +++ b/packages/image_picker/image_picker_macos/pubspec.yaml @@ -32,3 +32,8 @@ topics: - image-picker - files - file-selection + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_windows/example/pubspec.yaml b/packages/image_picker/image_picker_windows/example/pubspec.yaml index 983f9520e36..07b51d19175 100644 --- a/packages/image_picker/image_picker_windows/example/pubspec.yaml +++ b/packages/image_picker/image_picker_windows/example/pubspec.yaml @@ -27,3 +27,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}, image_picker_windows: {path: ../../../image_picker/image_picker_windows}} diff --git a/packages/image_picker/image_picker_windows/lib/image_picker_windows.dart b/packages/image_picker/image_picker_windows/lib/image_picker_windows.dart index e9e414628c9..fd10a8fb0ea 100644 --- a/packages/image_picker/image_picker_windows/lib/image_picker_windows.dart +++ b/packages/image_picker/image_picker_windows/lib/image_picker_windows.dart @@ -168,14 +168,15 @@ class ImagePickerWindows extends CameraDelegatingImagePickerPlatform { throw UnimplementedError('Unknown ImageSource: $source'); } - // `maxWidth`, `maxHeight`, and `imageQuality` arguments are not currently - // supported. If any of these arguments are supplied, they will be silently - // ignored. + // `maxWidth`, `maxHeight`, `imageQuality`, and `limit` arguments are not + // currently supported. If any of these arguments are supplied, they will + // be silently ignored. @override Future> getMultiImage({ double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) async { const XTypeGroup typeGroup = XTypeGroup(label: 'Images', extensions: imageFormats); diff --git a/packages/image_picker/image_picker_windows/pubspec.yaml b/packages/image_picker/image_picker_windows/pubspec.yaml index 23e4777888f..02f0f80ca3a 100644 --- a/packages/image_picker/image_picker_windows/pubspec.yaml +++ b/packages/image_picker/image_picker_windows/pubspec.yaml @@ -32,3 +32,8 @@ topics: - image-picker - files - file-selection + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}} From 38d6d79d4c0a05b8bf5b11f9292876fe60a7e4cb Mon Sep 17 00:00:00 2001 From: pdenert Date: Sun, 25 Feb 2024 03:34:41 +0100 Subject: [PATCH 03/45] Update image picker test mocks --- .../image_picker/image_picker/test/image_picker_test.mocks.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/image_picker/image_picker/test/image_picker_test.mocks.dart b/packages/image_picker/image_picker/test/image_picker_test.mocks.dart index dcd89d9ac45..0500c646c3a 100644 --- a/packages/image_picker/image_picker/test/image_picker_test.mocks.dart +++ b/packages/image_picker/image_picker/test/image_picker_test.mocks.dart @@ -158,6 +158,7 @@ class MockImagePickerPlatform extends _i1.Mock double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) => (super.noSuchMethod( Invocation.method( @@ -167,6 +168,7 @@ class MockImagePickerPlatform extends _i1.Mock #maxWidth: maxWidth, #maxHeight: maxHeight, #imageQuality: imageQuality, + #limit: limit, }, ), returnValue: _i4.Future?>.value(), From 05d39532ce3a575e20c0c5a8d01ecb603dc649e6 Mon Sep 17 00:00:00 2001 From: pdenert Date: Sun, 25 Feb 2024 03:50:28 +0100 Subject: [PATCH 04/45] Format dart files --- .../lib/src/messages.g.dart | 53 +++++---- .../image_picker_android/test/test_api.g.dart | 96 +++++++++++------ .../image_picker_ios/lib/src/messages.g.dart | 57 ++++++---- .../image_picker_ios/test/test_api.g.dart | 101 +++++++++++------- 4 files changed, 196 insertions(+), 111 deletions(-) diff --git a/packages/image_picker/image_picker_android/lib/src/messages.g.dart b/packages/image_picker/image_picker_android/lib/src/messages.g.dart index e728ff2756b..9dbf07d3c86 100644 --- a/packages/image_picker/image_picker_android/lib/src/messages.g.dart +++ b/packages/image_picker/image_picker_android/lib/src/messages.g.dart @@ -110,7 +110,8 @@ class MediaSelectionOptions { static MediaSelectionOptions decode(Object result) { result as List; return MediaSelectionOptions( - imageSelectionOptions: ImageSelectionOptions.decode(result[0]! as List), + imageSelectionOptions: + ImageSelectionOptions.decode(result[0]! as List), ); } } @@ -160,9 +161,7 @@ class SourceSpecification { result as List; return SourceSpecification( type: SourceType.values[result[0]! as int], - camera: result[1] != null - ? SourceCamera.values[result[1]! as int] - : null, + camera: result[1] != null ? SourceCamera.values[result[1]! as int] : null, ); } } @@ -269,19 +268,19 @@ class _ImagePickerApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return CacheRetrievalError.decode(readValue(buffer)!); - case 129: + case 129: return CacheRetrievalResult.decode(readValue(buffer)!); - case 130: + case 130: return GeneralOptions.decode(readValue(buffer)!); - case 131: + case 131: return ImageSelectionOptions.decode(readValue(buffer)!); - case 132: + case 132: return MediaSelectionOptions.decode(readValue(buffer)!); - case 133: + case 133: return SourceSpecification.decode(readValue(buffer)!); - case 134: + case 134: return VideoSelectionOptions.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -303,12 +302,16 @@ class ImagePickerApi { /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickImages(SourceSpecification arg_source, ImageSelectionOptions arg_options, GeneralOptions arg_generalOptions) async { + Future> pickImages( + SourceSpecification arg_source, + ImageSelectionOptions arg_options, + GeneralOptions arg_generalOptions) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImagePickerApi.pickImages', codec, binaryMessenger: _binaryMessenger); - final List? replyList = - await channel.send([arg_source, arg_options, arg_generalOptions]) as List?; + final List? replyList = await channel + .send([arg_source, arg_options, arg_generalOptions]) + as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -334,12 +337,16 @@ class ImagePickerApi { /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickVideos(SourceSpecification arg_source, VideoSelectionOptions arg_options, GeneralOptions arg_generalOptions) async { + Future> pickVideos( + SourceSpecification arg_source, + VideoSelectionOptions arg_options, + GeneralOptions arg_generalOptions) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImagePickerApi.pickVideos', codec, binaryMessenger: _binaryMessenger); - final List? replyList = - await channel.send([arg_source, arg_options, arg_generalOptions]) as List?; + final List? replyList = await channel + .send([arg_source, arg_options, arg_generalOptions]) + as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -365,12 +372,15 @@ class ImagePickerApi { /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickMedia(MediaSelectionOptions arg_mediaSelectionOptions, GeneralOptions arg_generalOptions) async { + Future> pickMedia( + MediaSelectionOptions arg_mediaSelectionOptions, + GeneralOptions arg_generalOptions) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImagePickerApi.pickMedia', codec, binaryMessenger: _binaryMessenger); - final List? replyList = - await channel.send([arg_mediaSelectionOptions, arg_generalOptions]) as List?; + final List? replyList = await channel + .send([arg_mediaSelectionOptions, arg_generalOptions]) + as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -397,8 +407,7 @@ class ImagePickerApi { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImagePickerApi.retrieveLostResults', codec, binaryMessenger: _binaryMessenger); - final List? replyList = - await channel.send(null) as List?; + final List? replyList = await channel.send(null) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', diff --git a/packages/image_picker/image_picker_android/test/test_api.g.dart b/packages/image_picker/image_picker_android/test/test_api.g.dart index 1b8b1fa58b9..d3b68913a68 100644 --- a/packages/image_picker/image_picker_android/test/test_api.g.dart +++ b/packages/image_picker/image_picker_android/test/test_api.g.dart @@ -46,19 +46,19 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return CacheRetrievalError.decode(readValue(buffer)!); - case 129: + case 129: return CacheRetrievalResult.decode(readValue(buffer)!); - case 130: + case 130: return GeneralOptions.decode(readValue(buffer)!); - case 131: + case 131: return ImageSelectionOptions.decode(readValue(buffer)!); - case 132: + case 132: return MediaSelectionOptions.decode(readValue(buffer)!); - case 133: + case 133: return SourceSpecification.decode(readValue(buffer)!); - case 134: + case 134: return VideoSelectionOptions.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -67,52 +67,64 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { } abstract class TestHostImagePickerApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = _TestHostImagePickerApiCodec(); /// Selects images and returns their paths. /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickImages(SourceSpecification source, ImageSelectionOptions options, GeneralOptions generalOptions); + Future> pickImages(SourceSpecification source, + ImageSelectionOptions options, GeneralOptions generalOptions); /// Selects video and returns their paths. /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickVideos(SourceSpecification source, VideoSelectionOptions options, GeneralOptions generalOptions); + Future> pickVideos(SourceSpecification source, + VideoSelectionOptions options, GeneralOptions generalOptions); /// Selects images and videos and returns their paths. /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickMedia(MediaSelectionOptions mediaSelectionOptions, GeneralOptions generalOptions); + Future> pickMedia(MediaSelectionOptions mediaSelectionOptions, + GeneralOptions generalOptions); /// Returns results from a previous app session, if any. CacheRetrievalResult? retrieveLostResults(); - static void setup(TestHostImagePickerApi? api, {BinaryMessenger? binaryMessenger}) { + static void setup(TestHostImagePickerApi? api, + {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImagePickerApi.pickImages', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null.'); + 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null.'); final List args = (message as List?)!; - final SourceSpecification? arg_source = (args[0] as SourceSpecification?); + final SourceSpecification? arg_source = + (args[0] as SourceSpecification?); assert(arg_source != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null, expected non-null SourceSpecification.'); - final ImageSelectionOptions? arg_options = (args[1] as ImageSelectionOptions?); + final ImageSelectionOptions? arg_options = + (args[1] as ImageSelectionOptions?); assert(arg_options != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null, expected non-null ImageSelectionOptions.'); - final GeneralOptions? arg_generalOptions = (args[2] as GeneralOptions?); + final GeneralOptions? arg_generalOptions = + (args[2] as GeneralOptions?); assert(arg_generalOptions != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null, expected non-null GeneralOptions.'); - final List output = await api.pickImages(arg_source!, arg_options!, arg_generalOptions!); + final List output = await api.pickImages( + arg_source!, arg_options!, arg_generalOptions!); return [output]; }); } @@ -122,22 +134,29 @@ abstract class TestHostImagePickerApi { 'dev.flutter.pigeon.ImagePickerApi.pickVideos', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null.'); + 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null.'); final List args = (message as List?)!; - final SourceSpecification? arg_source = (args[0] as SourceSpecification?); + final SourceSpecification? arg_source = + (args[0] as SourceSpecification?); assert(arg_source != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null, expected non-null SourceSpecification.'); - final VideoSelectionOptions? arg_options = (args[1] as VideoSelectionOptions?); + final VideoSelectionOptions? arg_options = + (args[1] as VideoSelectionOptions?); assert(arg_options != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null, expected non-null VideoSelectionOptions.'); - final GeneralOptions? arg_generalOptions = (args[2] as GeneralOptions?); + final GeneralOptions? arg_generalOptions = + (args[2] as GeneralOptions?); assert(arg_generalOptions != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null, expected non-null GeneralOptions.'); - final List output = await api.pickVideos(arg_source!, arg_options!, arg_generalOptions!); + final List output = await api.pickVideos( + arg_source!, arg_options!, arg_generalOptions!); return [output]; }); } @@ -147,19 +166,25 @@ abstract class TestHostImagePickerApi { 'dev.flutter.pigeon.ImagePickerApi.pickMedia', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickMedia was null.'); + 'Argument for dev.flutter.pigeon.ImagePickerApi.pickMedia was null.'); final List args = (message as List?)!; - final MediaSelectionOptions? arg_mediaSelectionOptions = (args[0] as MediaSelectionOptions?); + final MediaSelectionOptions? arg_mediaSelectionOptions = + (args[0] as MediaSelectionOptions?); assert(arg_mediaSelectionOptions != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickMedia was null, expected non-null MediaSelectionOptions.'); - final GeneralOptions? arg_generalOptions = (args[1] as GeneralOptions?); + final GeneralOptions? arg_generalOptions = + (args[1] as GeneralOptions?); assert(arg_generalOptions != null, 'Argument for dev.flutter.pigeon.ImagePickerApi.pickMedia was null, expected non-null GeneralOptions.'); - final List output = await api.pickMedia(arg_mediaSelectionOptions!, arg_generalOptions!); + final List output = await api.pickMedia( + arg_mediaSelectionOptions!, arg_generalOptions!); return [output]; }); } @@ -169,9 +194,12 @@ abstract class TestHostImagePickerApi { 'dev.flutter.pigeon.ImagePickerApi.retrieveLostResults', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { // ignore message final CacheRetrievalResult? output = api.retrieveLostResults(); return [output]; diff --git a/packages/image_picker/image_picker_ios/lib/src/messages.g.dart b/packages/image_picker/image_picker_ios/lib/src/messages.g.dart index baa1f6582c5..4c44d444ddb 100644 --- a/packages/image_picker/image_picker_ios/lib/src/messages.g.dart +++ b/packages/image_picker/image_picker_ios/lib/src/messages.g.dart @@ -142,11 +142,11 @@ class _ImagePickerApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return MaxSize.decode(readValue(buffer)!); - case 129: + case 129: return MediaSelectionOptions.decode(readValue(buffer)!); - case 130: + case 130: return SourceSpecification.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -164,15 +164,21 @@ class ImagePickerApi { static const MessageCodec codec = _ImagePickerApiCodec(); - Future pickImage(SourceSpecification arg_source, MaxSize arg_maxSize, int? arg_imageQuality, bool arg_requestFullMetadata) async { - const String channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage'; + Future pickImage(SourceSpecification arg_source, MaxSize arg_maxSize, + int? arg_imageQuality, bool arg_requestFullMetadata) async { + const String channelName = + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage'; final BasicMessageChannel channel = BasicMessageChannel( channelName, codec, binaryMessenger: _binaryMessenger, ); - final List? replyList = - await channel.send([arg_source, arg_maxSize, arg_imageQuality, arg_requestFullMetadata]) as List?; + final List? replyList = await channel.send([ + arg_source, + arg_maxSize, + arg_imageQuality, + arg_requestFullMetadata + ]) as List?; if (replyList == null) { throw _createConnectionError(channelName); } else if (replyList.length > 1) { @@ -186,15 +192,24 @@ class ImagePickerApi { } } - Future> pickMultiImage(MaxSize arg_maxSize, int? arg_imageQuality, bool arg_requestFullMetadata, int? arg_limit) async { - const String channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage'; + Future> pickMultiImage( + MaxSize arg_maxSize, + int? arg_imageQuality, + bool arg_requestFullMetadata, + int? arg_limit) async { + const String channelName = + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage'; final BasicMessageChannel channel = BasicMessageChannel( channelName, codec, binaryMessenger: _binaryMessenger, ); - final List? replyList = - await channel.send([arg_maxSize, arg_imageQuality, arg_requestFullMetadata, arg_limit]) as List?; + final List? replyList = await channel.send([ + arg_maxSize, + arg_imageQuality, + arg_requestFullMetadata, + arg_limit + ]) as List?; if (replyList == null) { throw _createConnectionError(channelName); } else if (replyList.length > 1) { @@ -213,15 +228,17 @@ class ImagePickerApi { } } - Future pickVideo(SourceSpecification arg_source, int? arg_maxDurationSeconds) async { - const String channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo'; + Future pickVideo( + SourceSpecification arg_source, int? arg_maxDurationSeconds) async { + const String channelName = + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo'; final BasicMessageChannel channel = BasicMessageChannel( channelName, codec, binaryMessenger: _binaryMessenger, ); - final List? replyList = - await channel.send([arg_source, arg_maxDurationSeconds]) as List?; + final List? replyList = await channel + .send([arg_source, arg_maxDurationSeconds]) as List?; if (replyList == null) { throw _createConnectionError(channelName); } else if (replyList.length > 1) { @@ -236,15 +253,17 @@ class ImagePickerApi { } /// Selects images and videos and returns their paths. - Future> pickMedia(MediaSelectionOptions arg_mediaSelectionOptions) async { - const String channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia'; + Future> pickMedia( + MediaSelectionOptions arg_mediaSelectionOptions) async { + const String channelName = + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia'; final BasicMessageChannel channel = BasicMessageChannel( channelName, codec, binaryMessenger: _binaryMessenger, ); - final List? replyList = - await channel.send([arg_mediaSelectionOptions]) as List?; + final List? replyList = await channel + .send([arg_mediaSelectionOptions]) as List?; if (replyList == null) { throw _createConnectionError(channelName); } else if (replyList.length > 1) { diff --git a/packages/image_picker/image_picker_ios/test/test_api.g.dart b/packages/image_picker/image_picker_ios/test/test_api.g.dart index 1f5bb816932..e9bbf05f9de 100644 --- a/packages/image_picker/image_picker_ios/test/test_api.g.dart +++ b/packages/image_picker/image_picker_ios/test/test_api.g.dart @@ -34,11 +34,11 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return MaxSize.decode(readValue(buffer)!); - case 129: + case 129: return MediaSelectionOptions.decode(readValue(buffer)!); - case 130: + case 130: return SourceSpecification.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -47,31 +47,40 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { } abstract class TestHostImagePickerApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = _TestHostImagePickerApiCodec(); - Future pickImage(SourceSpecification source, MaxSize maxSize, int? imageQuality, bool requestFullMetadata); + Future pickImage(SourceSpecification source, MaxSize maxSize, + int? imageQuality, bool requestFullMetadata); - Future> pickMultiImage(MaxSize maxSize, int? imageQuality, bool requestFullMetadata, int? limit); + Future> pickMultiImage( + MaxSize maxSize, int? imageQuality, bool requestFullMetadata, int? limit); - Future pickVideo(SourceSpecification source, int? maxDurationSeconds); + Future pickVideo( + SourceSpecification source, int? maxDurationSeconds); /// Selects images and videos and returns their paths. Future> pickMedia(MediaSelectionOptions mediaSelectionOptions); - static void setup(TestHostImagePickerApi? api, {BinaryMessenger? binaryMessenger}) { + static void setup(TestHostImagePickerApi? api, + {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null.'); final List args = (message as List?)!; - final SourceSpecification? arg_source = (args[0] as SourceSpecification?); + final SourceSpecification? arg_source = + (args[0] as SourceSpecification?); assert(arg_source != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null, expected non-null SourceSpecification.'); final MaxSize? arg_maxSize = (args[1] as MaxSize?); @@ -82,26 +91,32 @@ abstract class TestHostImagePickerApi { assert(arg_requestFullMetadata != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null, expected non-null bool.'); try { - final String? output = await api.pickImage(arg_source!, arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!); + final String? output = await api.pickImage(arg_source!, + arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage', codec, + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage', + codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage was null.'); final List args = (message as List?)!; final MaxSize? arg_maxSize = (args[0] as MaxSize?); assert(arg_maxSize != null, @@ -112,12 +127,14 @@ abstract class TestHostImagePickerApi { 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage was null, expected non-null bool.'); final int? arg_limit = (args[3] as int?); try { - final List output = await api.pickMultiImage(arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!, arg_limit); + final List output = await api.pickMultiImage(arg_maxSize!, + arg_imageQuality, arg_requestFullMetadata!, arg_limit); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } @@ -127,23 +144,29 @@ abstract class TestHostImagePickerApi { 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo was null.'); final List args = (message as List?)!; - final SourceSpecification? arg_source = (args[0] as SourceSpecification?); + final SourceSpecification? arg_source = + (args[0] as SourceSpecification?); assert(arg_source != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo was null, expected non-null SourceSpecification.'); final int? arg_maxDurationSeconds = (args[1] as int?); try { - final String? output = await api.pickVideo(arg_source!, arg_maxDurationSeconds); + final String? output = + await api.pickVideo(arg_source!, arg_maxDurationSeconds); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } @@ -153,22 +176,28 @@ abstract class TestHostImagePickerApi { 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia was null.'); final List args = (message as List?)!; - final MediaSelectionOptions? arg_mediaSelectionOptions = (args[0] as MediaSelectionOptions?); + final MediaSelectionOptions? arg_mediaSelectionOptions = + (args[0] as MediaSelectionOptions?); assert(arg_mediaSelectionOptions != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia was null, expected non-null MediaSelectionOptions.'); try { - final List output = await api.pickMedia(arg_mediaSelectionOptions!); + final List output = + await api.pickMedia(arg_mediaSelectionOptions!); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } From a974ac9209ac971ce51b76e339cdd3419688094e Mon Sep 17 00:00:00 2001 From: pdenert Date: Sun, 25 Feb 2024 04:13:26 +0100 Subject: [PATCH 05/45] Do clang-format --- .../ios/Classes/FLTImagePickerPlugin.m | 4 +- .../image_picker_ios/ios/Classes/messages.g.h | 52 +++++--- .../image_picker_ios/ios/Classes/messages.g.m | 119 +++++++++++------- 3 files changed, 105 insertions(+), 70 deletions(-) diff --git a/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m b/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m index 70c6681b581..c65542ddf12 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m +++ b/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m @@ -190,7 +190,7 @@ - (void)pickImageWithSource:(nonnull FLTSourceSpecification *)source - (void)pickMultiImageWithMaxSize:(nonnull FLTMaxSize *)maxSize quality:(nullable NSNumber *)imageQuality fullMetadata:(BOOL)fullMetadata - limit:(nullable NSNumber *)limit + limit:(nullable NSNumber *)limit completion:(nonnull void (^)(NSArray *_Nullable, FlutterError *_Nullable))completion { [self cancelInProgressCall]; @@ -200,7 +200,7 @@ - (void)pickMultiImageWithMaxSize:(nonnull FLTMaxSize *)maxSize context.imageQuality = imageQuality; context.requestFullMetadata = fullMetadata; context.maxImageCount = limit.intValue; - + if (@available(iOS 14, *)) { [self launchPHPickerWithContext:context]; } else { diff --git a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h index 22729da380e..0fdf6b57f49 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h +++ b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h @@ -40,32 +40,30 @@ typedef NS_ENUM(NSUInteger, FLTSourceType) { @class FLTSourceSpecification; @interface FLTMaxSize : NSObject -+ (instancetype)makeWithWidth:(nullable NSNumber *)width - height:(nullable NSNumber *)height; -@property(nonatomic, strong, nullable) NSNumber * width; -@property(nonatomic, strong, nullable) NSNumber * height; ++ (instancetype)makeWithWidth:(nullable NSNumber *)width height:(nullable NSNumber *)height; +@property(nonatomic, strong, nullable) NSNumber *width; +@property(nonatomic, strong, nullable) NSNumber *height; @end @interface FLTMediaSelectionOptions : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; + (instancetype)makeWithMaxSize:(FLTMaxSize *)maxSize - imageQuality:(nullable NSNumber *)imageQuality - requestFullMetadata:(BOOL )requestFullMetadata - allowMultiple:(BOOL )allowMultiple - limit:(nullable NSNumber *)limit; -@property(nonatomic, strong) FLTMaxSize * maxSize; -@property(nonatomic, strong, nullable) NSNumber * imageQuality; -@property(nonatomic, assign) BOOL requestFullMetadata; -@property(nonatomic, assign) BOOL allowMultiple; -@property(nonatomic, strong, nullable) NSNumber * limit; + imageQuality:(nullable NSNumber *)imageQuality + requestFullMetadata:(BOOL)requestFullMetadata + allowMultiple:(BOOL)allowMultiple + limit:(nullable NSNumber *)limit; +@property(nonatomic, strong) FLTMaxSize *maxSize; +@property(nonatomic, strong, nullable) NSNumber *imageQuality; +@property(nonatomic, assign) BOOL requestFullMetadata; +@property(nonatomic, assign) BOOL allowMultiple; +@property(nonatomic, strong, nullable) NSNumber *limit; @end @interface FLTSourceSpecification : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithType:(FLTSourceType)type - camera:(FLTSourceCamera)camera; ++ (instancetype)makeWithType:(FLTSourceType)type camera:(FLTSourceCamera)camera; @property(nonatomic, assign) FLTSourceType type; @property(nonatomic, assign) FLTSourceCamera camera; @end @@ -74,13 +72,27 @@ typedef NS_ENUM(NSUInteger, FLTSourceType) { NSObject *FLTImagePickerApiGetCodec(void); @protocol FLTImagePickerApi -- (void)pickImageWithSource:(FLTSourceSpecification *)source maxSize:(FLTMaxSize *)maxSize quality:(nullable NSNumber *)imageQuality fullMetadata:(BOOL)requestFullMetadata completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; -- (void)pickMultiImageWithMaxSize:(FLTMaxSize *)maxSize quality:(nullable NSNumber *)imageQuality fullMetadata:(BOOL)requestFullMetadata limit:(nullable NSNumber *)limit completion:(void (^)(NSArray *_Nullable, FlutterError *_Nullable))completion; -- (void)pickVideoWithSource:(FLTSourceSpecification *)source maxDuration:(nullable NSNumber *)maxDurationSeconds completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)pickImageWithSource:(FLTSourceSpecification *)source + maxSize:(FLTMaxSize *)maxSize + quality:(nullable NSNumber *)imageQuality + fullMetadata:(BOOL)requestFullMetadata + completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)pickMultiImageWithMaxSize:(FLTMaxSize *)maxSize + quality:(nullable NSNumber *)imageQuality + fullMetadata:(BOOL)requestFullMetadata + limit:(nullable NSNumber *)limit + completion:(void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion; +- (void)pickVideoWithSource:(FLTSourceSpecification *)source + maxDuration:(nullable NSNumber *)maxDurationSeconds + completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; /// Selects images and videos and returns their paths. -- (void)pickMediaWithMediaSelectionOptions:(FLTMediaSelectionOptions *)mediaSelectionOptions completion:(void (^)(NSArray *_Nullable, FlutterError *_Nullable))completion; +- (void)pickMediaWithMediaSelectionOptions:(FLTMediaSelectionOptions *)mediaSelectionOptions + completion:(void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion; @end -extern void SetUpFLTImagePickerApi(id binaryMessenger, NSObject *_Nullable api); +extern void SetUpFLTImagePickerApi(id binaryMessenger, + NSObject *_Nullable api); NS_ASSUME_NONNULL_END diff --git a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m index 1cc556fa8a4..9bad4441121 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m +++ b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m @@ -69,9 +69,8 @@ - (NSArray *)toList; @end @implementation FLTMaxSize -+ (instancetype)makeWithWidth:(nullable NSNumber *)width - height:(nullable NSNumber *)height { - FLTMaxSize* pigeonResult = [[FLTMaxSize alloc] init]; ++ (instancetype)makeWithWidth:(nullable NSNumber *)width height:(nullable NSNumber *)height { + FLTMaxSize *pigeonResult = [[FLTMaxSize alloc] init]; pigeonResult.width = width; pigeonResult.height = height; return pigeonResult; @@ -95,11 +94,11 @@ - (NSArray *)toList { @implementation FLTMediaSelectionOptions + (instancetype)makeWithMaxSize:(FLTMaxSize *)maxSize - imageQuality:(nullable NSNumber *)imageQuality - requestFullMetadata:(BOOL )requestFullMetadata - allowMultiple:(BOOL )allowMultiple - limit:(nullable NSNumber *)limit { - FLTMediaSelectionOptions* pigeonResult = [[FLTMediaSelectionOptions alloc] init]; + imageQuality:(nullable NSNumber *)imageQuality + requestFullMetadata:(BOOL)requestFullMetadata + allowMultiple:(BOOL)allowMultiple + limit:(nullable NSNumber *)limit { + FLTMediaSelectionOptions *pigeonResult = [[FLTMediaSelectionOptions alloc] init]; pigeonResult.maxSize = maxSize; pigeonResult.imageQuality = imageQuality; pigeonResult.requestFullMetadata = requestFullMetadata; @@ -131,9 +130,8 @@ - (NSArray *)toList { @end @implementation FLTSourceSpecification -+ (instancetype)makeWithType:(FLTSourceType)type - camera:(FLTSourceCamera)camera { - FLTSourceSpecification* pigeonResult = [[FLTSourceSpecification alloc] init]; ++ (instancetype)makeWithType:(FLTSourceType)type camera:(FLTSourceCamera)camera { + FLTSourceSpecification *pigeonResult = [[FLTSourceSpecification alloc] init]; pigeonResult.type = type; pigeonResult.camera = camera; return pigeonResult; @@ -160,11 +158,11 @@ @interface FLTImagePickerApiCodecReader : FlutterStandardReader @implementation FLTImagePickerApiCodecReader - (nullable id)readValueOfType:(UInt8)type { switch (type) { - case 128: + case 128: return [FLTMaxSize fromList:[self readValue]]; - case 129: + case 129: return [FLTMediaSelectionOptions fromList:[self readValue]]; - case 130: + case 130: return [FLTSourceSpecification fromList:[self readValue]]; default: return [super readValueOfType:type]; @@ -206,72 +204,93 @@ - (FlutterStandardReader *)readerWithData:(NSData *)data { static FlutterStandardMessageCodec *sSharedObject = nil; static dispatch_once_t sPred = 0; dispatch_once(&sPred, ^{ - FLTImagePickerApiCodecReaderWriter *readerWriter = [[FLTImagePickerApiCodecReaderWriter alloc] init]; + FLTImagePickerApiCodecReaderWriter *readerWriter = + [[FLTImagePickerApiCodecReaderWriter alloc] init]; sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; }); return sSharedObject; } -void SetUpFLTImagePickerApi(id binaryMessenger, NSObject *api) { +void SetUpFLTImagePickerApi(id binaryMessenger, + NSObject *api) { { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage" + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pickImageWithSource:maxSize:quality:fullMetadata:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickImageWithSource:maxSize:quality:fullMetadata:completion:)", api); + NSCAssert([api respondsToSelector:@selector + (pickImageWithSource:maxSize:quality:fullMetadata:completion:)], + @"FLTImagePickerApi api (%@) doesn't respond to " + @"@selector(pickImageWithSource:maxSize:quality:fullMetadata:completion:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTSourceSpecification *arg_source = GetNullableObjectAtIndex(args, 0); FLTMaxSize *arg_maxSize = GetNullableObjectAtIndex(args, 1); NSNumber *arg_imageQuality = GetNullableObjectAtIndex(args, 2); BOOL arg_requestFullMetadata = [GetNullableObjectAtIndex(args, 3) boolValue]; - [api pickImageWithSource:arg_source maxSize:arg_maxSize quality:arg_imageQuality fullMetadata:arg_requestFullMetadata completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickImageWithSource:arg_source + maxSize:arg_maxSize + quality:arg_imageQuality + fullMetadata:arg_requestFullMetadata + completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage" + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)", api); + NSCAssert([api respondsToSelector:@selector + (pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)], + @"FLTImagePickerApi api (%@) doesn't respond to " + @"@selector(pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTMaxSize *arg_maxSize = GetNullableObjectAtIndex(args, 0); NSNumber *arg_imageQuality = GetNullableObjectAtIndex(args, 1); BOOL arg_requestFullMetadata = [GetNullableObjectAtIndex(args, 2) boolValue]; NSNumber *arg_limit = GetNullableObjectAtIndex(args, 3); - [api pickMultiImageWithMaxSize:arg_maxSize quality:arg_imageQuality fullMetadata:arg_requestFullMetadata limit:arg_limit completion:^(NSArray *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickMultiImageWithMaxSize:arg_maxSize + quality:arg_imageQuality + fullMetadata:arg_requestFullMetadata + limit:arg_limit + completion:^(NSArray *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo" + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pickVideoWithSource:maxDuration:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickVideoWithSource:maxDuration:completion:)", api); + NSCAssert([api respondsToSelector:@selector(pickVideoWithSource:maxDuration:completion:)], + @"FLTImagePickerApi api (%@) doesn't respond to " + @"@selector(pickVideoWithSource:maxDuration:completion:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTSourceSpecification *arg_source = GetNullableObjectAtIndex(args, 0); NSNumber *arg_maxDurationSeconds = GetNullableObjectAtIndex(args, 1); - [api pickVideoWithSource:arg_source maxDuration:arg_maxDurationSeconds completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickVideoWithSource:arg_source + maxDuration:arg_maxDurationSeconds + completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; @@ -279,19 +298,23 @@ void SetUpFLTImagePickerApi(id binaryMessenger, NSObject } /// Selects images and videos and returns their paths. { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia" + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pickMediaWithMediaSelectionOptions:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickMediaWithMediaSelectionOptions:completion:)", api); + NSCAssert([api respondsToSelector:@selector(pickMediaWithMediaSelectionOptions:completion:)], + @"FLTImagePickerApi api (%@) doesn't respond to " + @"@selector(pickMediaWithMediaSelectionOptions:completion:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTMediaSelectionOptions *arg_mediaSelectionOptions = GetNullableObjectAtIndex(args, 0); - [api pickMediaWithMediaSelectionOptions:arg_mediaSelectionOptions completion:^(NSArray *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickMediaWithMediaSelectionOptions:arg_mediaSelectionOptions + completion:^(NSArray *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; From 56cffc02a8bf8e5b85291733d7ce31be4e41ccd8 Mon Sep 17 00:00:00 2001 From: pdenert Date: Sun, 25 Feb 2024 04:21:31 +0100 Subject: [PATCH 06/45] Update pigeon and fix ios tests --- .../image_picker_ios/ios/Classes/messages.g.h | 2 +- .../image_picker_ios/ios/Classes/messages.g.m | 2 +- .../image_picker_ios/lib/src/messages.g.dart | 173 +++++++++--------- .../image_picker_ios/pubspec.yaml | 2 +- .../test/image_picker_ios_test.dart | 26 +++ .../image_picker_ios/test/test_api.g.dart | 121 +++++------- 6 files changed, 157 insertions(+), 169 deletions(-) diff --git a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h index 0fdf6b57f49..de9a8200b82 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h +++ b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v13.1.2), do not edit directly. +// Autogenerated from Pigeon (v17.0.0), do not edit directly. // See also: https://pub.dev/packages/pigeon #import diff --git a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m index 9bad4441121..a1f5794dd6a 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m +++ b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v13.1.2), do not edit directly. +// Autogenerated from Pigeon (v17.0.0), do not edit directly. // See also: https://pub.dev/packages/pigeon #import "messages.g.h" diff --git a/packages/image_picker/image_picker_ios/lib/src/messages.g.dart b/packages/image_picker/image_picker_ios/lib/src/messages.g.dart index 4c44d444ddb..07f8face4ff 100644 --- a/packages/image_picker/image_picker_ios/lib/src/messages.g.dart +++ b/packages/image_picker/image_picker_ios/lib/src/messages.g.dart @@ -1,9 +1,9 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v13.1.2), do not edit directly. +// Autogenerated from Pigeon (v17.0.0), do not edit directly. // See also: https://pub.dev/packages/pigeon -// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import +// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers import 'dart:async'; import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; @@ -18,6 +18,16 @@ PlatformException _createConnectionError(String channelName) { ); } +List wrapResponse({Object? result, PlatformException? error, bool empty = false}) { + if (empty) { + return []; + } + if (error == null) { + return [result]; + } + return [error.code, error.message, error.details]; +} + enum SourceCamera { rear, front, @@ -142,11 +152,11 @@ class _ImagePickerApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return MaxSize.decode(readValue(buffer)!); - case 129: + case 129: return MediaSelectionOptions.decode(readValue(buffer)!); - case 130: + case 130: return SourceSpecification.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -159,126 +169,107 @@ class ImagePickerApi { /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. ImagePickerApi({BinaryMessenger? binaryMessenger}) - : _binaryMessenger = binaryMessenger; - final BinaryMessenger? _binaryMessenger; - - static const MessageCodec codec = _ImagePickerApiCodec(); - - Future pickImage(SourceSpecification arg_source, MaxSize arg_maxSize, - int? arg_imageQuality, bool arg_requestFullMetadata) async { - const String channelName = - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage'; - final BasicMessageChannel channel = BasicMessageChannel( - channelName, - codec, - binaryMessenger: _binaryMessenger, + : __pigeon_binaryMessenger = binaryMessenger; + final BinaryMessenger? __pigeon_binaryMessenger; + + static const MessageCodec pigeonChannelCodec = _ImagePickerApiCodec(); + + Future pickImage(SourceSpecification source, MaxSize maxSize, int? imageQuality, bool requestFullMetadata) async { + const String __pigeon_channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage'; + final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + __pigeon_channelName, + pigeonChannelCodec, + binaryMessenger: __pigeon_binaryMessenger, ); - final List? replyList = await channel.send([ - arg_source, - arg_maxSize, - arg_imageQuality, - arg_requestFullMetadata - ]) as List?; - if (replyList == null) { - throw _createConnectionError(channelName); - } else if (replyList.length > 1) { + final List? __pigeon_replyList = + await __pigeon_channel.send([source, maxSize, imageQuality, requestFullMetadata]) as List?; + if (__pigeon_replyList == null) { + throw _createConnectionError(__pigeon_channelName); + } else if (__pigeon_replyList.length > 1) { throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], + code: __pigeon_replyList[0]! as String, + message: __pigeon_replyList[1] as String?, + details: __pigeon_replyList[2], ); } else { - return (replyList[0] as String?); + return (__pigeon_replyList[0] as String?); } } - Future> pickMultiImage( - MaxSize arg_maxSize, - int? arg_imageQuality, - bool arg_requestFullMetadata, - int? arg_limit) async { - const String channelName = - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage'; - final BasicMessageChannel channel = BasicMessageChannel( - channelName, - codec, - binaryMessenger: _binaryMessenger, + Future> pickMultiImage(MaxSize maxSize, int? imageQuality, bool requestFullMetadata, int? limit) async { + const String __pigeon_channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage'; + final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + __pigeon_channelName, + pigeonChannelCodec, + binaryMessenger: __pigeon_binaryMessenger, ); - final List? replyList = await channel.send([ - arg_maxSize, - arg_imageQuality, - arg_requestFullMetadata, - arg_limit - ]) as List?; - if (replyList == null) { - throw _createConnectionError(channelName); - } else if (replyList.length > 1) { + final List? __pigeon_replyList = + await __pigeon_channel.send([maxSize, imageQuality, requestFullMetadata, limit]) as List?; + if (__pigeon_replyList == null) { + throw _createConnectionError(__pigeon_channelName); + } else if (__pigeon_replyList.length > 1) { throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], + code: __pigeon_replyList[0]! as String, + message: __pigeon_replyList[1] as String?, + details: __pigeon_replyList[2], ); - } else if (replyList[0] == null) { + } else if (__pigeon_replyList[0] == null) { throw PlatformException( code: 'null-error', message: 'Host platform returned null value for non-null return value.', ); } else { - return (replyList[0] as List?)!.cast(); + return (__pigeon_replyList[0] as List?)!.cast(); } } - Future pickVideo( - SourceSpecification arg_source, int? arg_maxDurationSeconds) async { - const String channelName = - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo'; - final BasicMessageChannel channel = BasicMessageChannel( - channelName, - codec, - binaryMessenger: _binaryMessenger, + Future pickVideo(SourceSpecification source, int? maxDurationSeconds) async { + const String __pigeon_channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo'; + final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + __pigeon_channelName, + pigeonChannelCodec, + binaryMessenger: __pigeon_binaryMessenger, ); - final List? replyList = await channel - .send([arg_source, arg_maxDurationSeconds]) as List?; - if (replyList == null) { - throw _createConnectionError(channelName); - } else if (replyList.length > 1) { + final List? __pigeon_replyList = + await __pigeon_channel.send([source, maxDurationSeconds]) as List?; + if (__pigeon_replyList == null) { + throw _createConnectionError(__pigeon_channelName); + } else if (__pigeon_replyList.length > 1) { throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], + code: __pigeon_replyList[0]! as String, + message: __pigeon_replyList[1] as String?, + details: __pigeon_replyList[2], ); } else { - return (replyList[0] as String?); + return (__pigeon_replyList[0] as String?); } } /// Selects images and videos and returns their paths. - Future> pickMedia( - MediaSelectionOptions arg_mediaSelectionOptions) async { - const String channelName = - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia'; - final BasicMessageChannel channel = BasicMessageChannel( - channelName, - codec, - binaryMessenger: _binaryMessenger, + Future> pickMedia(MediaSelectionOptions mediaSelectionOptions) async { + const String __pigeon_channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia'; + final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + __pigeon_channelName, + pigeonChannelCodec, + binaryMessenger: __pigeon_binaryMessenger, ); - final List? replyList = await channel - .send([arg_mediaSelectionOptions]) as List?; - if (replyList == null) { - throw _createConnectionError(channelName); - } else if (replyList.length > 1) { + final List? __pigeon_replyList = + await __pigeon_channel.send([mediaSelectionOptions]) as List?; + if (__pigeon_replyList == null) { + throw _createConnectionError(__pigeon_channelName); + } else if (__pigeon_replyList.length > 1) { throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], + code: __pigeon_replyList[0]! as String, + message: __pigeon_replyList[1] as String?, + details: __pigeon_replyList[2], ); - } else if (replyList[0] == null) { + } else if (__pigeon_replyList[0] == null) { throw PlatformException( code: 'null-error', message: 'Host platform returned null value for non-null return value.', ); } else { - return (replyList[0] as List?)!.cast(); + return (__pigeon_replyList[0] as List?)!.cast(); } } } diff --git a/packages/image_picker/image_picker_ios/pubspec.yaml b/packages/image_picker/image_picker_ios/pubspec.yaml index 0de6ea9b25e..6411dabdf26 100755 --- a/packages/image_picker/image_picker_ios/pubspec.yaml +++ b/packages/image_picker/image_picker_ios/pubspec.yaml @@ -25,7 +25,7 @@ dev_dependencies: flutter_test: sdk: flutter mockito: 5.4.4 - pigeon: ^13.0.0 + pigeon: ^17.0.0 topics: - camera diff --git a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart index ba101341c8c..852f5626294 100644 --- a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart +++ b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart @@ -331,6 +331,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), ], ); @@ -372,6 +373,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -379,6 +381,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -386,6 +389,7 @@ void main() { 'maxHeight': 10.0, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -393,6 +397,7 @@ void main() { 'maxHeight': 20.0, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -400,6 +405,7 @@ void main() { 'maxHeight': null, 'imageQuality': 70, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -407,6 +413,7 @@ void main() { 'maxHeight': 10.0, 'imageQuality': 70, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -414,6 +421,7 @@ void main() { 'maxHeight': 20.0, 'imageQuality': 70, 'requestFullMetadata': true, + 'limit': null, }), ], ); @@ -771,6 +779,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), ], ); @@ -812,6 +821,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -819,6 +829,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -826,6 +837,7 @@ void main() { 'maxHeight': 10.0, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -833,6 +845,7 @@ void main() { 'maxHeight': 20.0, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -840,6 +853,7 @@ void main() { 'maxHeight': null, 'imageQuality': 70, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -847,6 +861,7 @@ void main() { 'maxHeight': 10.0, 'imageQuality': 70, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -854,6 +869,7 @@ void main() { 'maxHeight': 20.0, 'imageQuality': 70, 'requestFullMetadata': true, + 'limit': null, }), ], ); @@ -1503,6 +1519,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), ], ); @@ -1555,6 +1572,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -1562,6 +1580,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -1569,6 +1588,7 @@ void main() { 'maxHeight': 10.0, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -1576,6 +1596,7 @@ void main() { 'maxHeight': 20.0, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -1583,6 +1604,7 @@ void main() { 'maxHeight': null, 'imageQuality': 70, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -1590,6 +1612,7 @@ void main() { 'maxHeight': 10.0, 'imageQuality': 70, 'requestFullMetadata': true, + 'limit': null, }), const _LoggedMethodCall('pickMultiImage', arguments: { @@ -1597,6 +1620,7 @@ void main() { 'maxHeight': 20.0, 'imageQuality': 70, 'requestFullMetadata': true, + 'limit': null, }), ], ); @@ -1663,6 +1687,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, + 'limit': null, }), ], ); @@ -1685,6 +1710,7 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': false, + 'limit': null, }), ], ); diff --git a/packages/image_picker/image_picker_ios/test/test_api.g.dart b/packages/image_picker/image_picker_ios/test/test_api.g.dart index e9bbf05f9de..aecc90f1078 100644 --- a/packages/image_picker/image_picker_ios/test/test_api.g.dart +++ b/packages/image_picker/image_picker_ios/test/test_api.g.dart @@ -1,9 +1,9 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v13.1.2), do not edit directly. +// Autogenerated from Pigeon (v17.0.0), do not edit directly. // See also: https://pub.dev/packages/pigeon -// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, unnecessary_import +// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, unnecessary_import, no_leading_underscores_for_local_identifiers // ignore_for_file: avoid_relative_lib_imports import 'dart:async'; import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; @@ -34,11 +34,11 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return MaxSize.decode(readValue(buffer)!); - case 129: + case 129: return MediaSelectionOptions.decode(readValue(buffer)!); - case 130: + case 130: return SourceSpecification.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -47,40 +47,31 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { } abstract class TestHostImagePickerApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; - static const MessageCodec codec = _TestHostImagePickerApiCodec(); + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; + static const MessageCodec pigeonChannelCodec = _TestHostImagePickerApiCodec(); - Future pickImage(SourceSpecification source, MaxSize maxSize, - int? imageQuality, bool requestFullMetadata); + Future pickImage(SourceSpecification source, MaxSize maxSize, int? imageQuality, bool requestFullMetadata); - Future> pickMultiImage( - MaxSize maxSize, int? imageQuality, bool requestFullMetadata, int? limit); + Future> pickMultiImage(MaxSize maxSize, int? imageQuality, bool requestFullMetadata, int? limit); - Future pickVideo( - SourceSpecification source, int? maxDurationSeconds); + Future pickVideo(SourceSpecification source, int? maxDurationSeconds); /// Selects images and videos and returns their paths. Future> pickMedia(MediaSelectionOptions mediaSelectionOptions); - static void setup(TestHostImagePickerApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestHostImagePickerApi? api, {BinaryMessenger? binaryMessenger}) { { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage', codec, + final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage', pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null.'); final List args = (message as List?)!; - final SourceSpecification? arg_source = - (args[0] as SourceSpecification?); + final SourceSpecification? arg_source = (args[0] as SourceSpecification?); assert(arg_source != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null, expected non-null SourceSpecification.'); final MaxSize? arg_maxSize = (args[1] as MaxSize?); @@ -91,32 +82,26 @@ abstract class TestHostImagePickerApi { assert(arg_requestFullMetadata != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null, expected non-null bool.'); try { - final String? output = await api.pickImage(arg_source!, - arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!); + final String? output = await api.pickImage(arg_source!, arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage', - codec, + final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage', pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage was null.'); final List args = (message as List?)!; final MaxSize? arg_maxSize = (args[0] as MaxSize?); assert(arg_maxSize != null, @@ -127,77 +112,63 @@ abstract class TestHostImagePickerApi { 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage was null, expected non-null bool.'); final int? arg_limit = (args[3] as int?); try { - final List output = await api.pickMultiImage(arg_maxSize!, - arg_imageQuality, arg_requestFullMetadata!, arg_limit); + final List output = await api.pickMultiImage(arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!, arg_limit); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo', codec, + final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo', pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo was null.'); final List args = (message as List?)!; - final SourceSpecification? arg_source = - (args[0] as SourceSpecification?); + final SourceSpecification? arg_source = (args[0] as SourceSpecification?); assert(arg_source != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo was null, expected non-null SourceSpecification.'); final int? arg_maxDurationSeconds = (args[1] as int?); try { - final String? output = - await api.pickVideo(arg_source!, arg_maxDurationSeconds); + final String? output = await api.pickVideo(arg_source!, arg_maxDurationSeconds); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia', codec, + final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia', pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia was null.'); final List args = (message as List?)!; - final MediaSelectionOptions? arg_mediaSelectionOptions = - (args[0] as MediaSelectionOptions?); + final MediaSelectionOptions? arg_mediaSelectionOptions = (args[0] as MediaSelectionOptions?); assert(arg_mediaSelectionOptions != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia was null, expected non-null MediaSelectionOptions.'); try { - final List output = - await api.pickMedia(arg_mediaSelectionOptions!); + final List output = await api.pickMedia(arg_mediaSelectionOptions!); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } From 2e8ebe125bee7e1fb402b0a4324d44e2fec7d87e Mon Sep 17 00:00:00 2001 From: pdenert Date: Sun, 25 Feb 2024 04:23:40 +0100 Subject: [PATCH 07/45] Update pigeon in image_picker_android --- .../flutter/plugins/imagepicker/Messages.java | 64 ++++-- .../lib/src/messages.g.dart | 183 ++++++++++-------- .../image_picker_android/pubspec.yaml | 2 +- .../image_picker_android/test/test_api.g.dart | 120 ++++++++---- 4 files changed, 233 insertions(+), 136 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/Messages.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/Messages.java index 2d567d95edc..9ef8f20ce2a 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/Messages.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/Messages.java @@ -1,11 +1,14 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v9.2.5), do not edit directly. +// Autogenerated from Pigeon (v17.0.0), do not edit directly. // See also: https://pub.dev/packages/pigeon package io.flutter.plugins.imagepicker; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.CLASS; + import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -14,6 +17,8 @@ import io.flutter.plugin.common.MessageCodec; import io.flutter.plugin.common.StandardMessageCodec; import java.io.ByteArrayOutputStream; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; @@ -60,6 +65,10 @@ protected static ArrayList wrapError(@NonNull Throwable exception) { return errorList; } + @Target(METHOD) + @Retention(CLASS) + @interface CanIgnoreReturnValue {} + public enum SourceCamera { REAR(0), FRONT(1); @@ -138,6 +147,7 @@ public static final class Builder { private @Nullable Boolean allowMultiple; + @CanIgnoreReturnValue public @NonNull Builder setAllowMultiple(@NonNull Boolean setterArg) { this.allowMultiple = setterArg; return this; @@ -145,6 +155,7 @@ public static final class Builder { private @Nullable Boolean usePhotoPicker; + @CanIgnoreReturnValue public @NonNull Builder setUsePhotoPicker(@NonNull Boolean setterArg) { this.usePhotoPicker = setterArg; return this; @@ -152,6 +163,7 @@ public static final class Builder { private @Nullable Long limit; + @CanIgnoreReturnValue public @NonNull Builder setLimit(@Nullable Long setterArg) { this.limit = setterArg; return this; @@ -162,8 +174,6 @@ public static final class Builder { pigeonReturn.setAllowMultiple(allowMultiple); pigeonReturn.setUsePhotoPicker(usePhotoPicker); pigeonReturn.setLimit(limit); - System.out.println("text here"); - return pigeonReturn; } } @@ -242,6 +252,7 @@ public static final class Builder { private @Nullable Double maxWidth; + @CanIgnoreReturnValue public @NonNull Builder setMaxWidth(@Nullable Double setterArg) { this.maxWidth = setterArg; return this; @@ -249,6 +260,7 @@ public static final class Builder { private @Nullable Double maxHeight; + @CanIgnoreReturnValue public @NonNull Builder setMaxHeight(@Nullable Double setterArg) { this.maxHeight = setterArg; return this; @@ -256,6 +268,7 @@ public static final class Builder { private @Nullable Long quality; + @CanIgnoreReturnValue public @NonNull Builder setQuality(@NonNull Long setterArg) { this.quality = setterArg; return this; @@ -313,6 +326,7 @@ public static final class Builder { private @Nullable ImageSelectionOptions imageSelectionOptions; + @CanIgnoreReturnValue public @NonNull Builder setImageSelectionOptions(@NonNull ImageSelectionOptions setterArg) { this.imageSelectionOptions = setterArg; return this; @@ -361,6 +375,7 @@ public static final class Builder { private @Nullable Long maxDurationSeconds; + @CanIgnoreReturnValue public @NonNull Builder setMaxDurationSeconds(@Nullable Long setterArg) { this.maxDurationSeconds = setterArg; return this; @@ -424,6 +439,7 @@ public static final class Builder { private @Nullable SourceType type; + @CanIgnoreReturnValue public @NonNull Builder setType(@NonNull SourceType setterArg) { this.type = setterArg; return this; @@ -431,6 +447,7 @@ public static final class Builder { private @Nullable SourceCamera camera; + @CanIgnoreReturnValue public @NonNull Builder setCamera(@Nullable SourceCamera setterArg) { this.camera = setterArg; return this; @@ -455,7 +472,7 @@ ArrayList toList() { static @NonNull SourceSpecification fromList(@NonNull ArrayList list) { SourceSpecification pigeonResult = new SourceSpecification(); Object type = list.get(0); - pigeonResult.setType(type == null ? null : SourceType.values()[(int) type]); + pigeonResult.setType(SourceType.values()[(int) type]); Object camera = list.get(1); pigeonResult.setCamera(camera == null ? null : SourceCamera.values()[(int) camera]); return pigeonResult; @@ -500,6 +517,7 @@ public static final class Builder { private @Nullable String code; + @CanIgnoreReturnValue public @NonNull Builder setCode(@NonNull String setterArg) { this.code = setterArg; return this; @@ -507,6 +525,7 @@ public static final class Builder { private @Nullable String message; + @CanIgnoreReturnValue public @NonNull Builder setMessage(@Nullable String setterArg) { this.message = setterArg; return this; @@ -595,6 +614,7 @@ public static final class Builder { private @Nullable CacheRetrievalType type; + @CanIgnoreReturnValue public @NonNull Builder setType(@NonNull CacheRetrievalType setterArg) { this.type = setterArg; return this; @@ -602,6 +622,7 @@ public static final class Builder { private @Nullable CacheRetrievalError error; + @CanIgnoreReturnValue public @NonNull Builder setError(@Nullable CacheRetrievalError setterArg) { this.error = setterArg; return this; @@ -609,6 +630,7 @@ public static final class Builder { private @Nullable List paths; + @CanIgnoreReturnValue public @NonNull Builder setPaths(@NonNull List setterArg) { this.paths = setterArg; return this; @@ -635,7 +657,7 @@ ArrayList toList() { static @NonNull CacheRetrievalResult fromList(@NonNull ArrayList list) { CacheRetrievalResult pigeonResult = new CacheRetrievalResult(); Object type = list.get(0); - pigeonResult.setType(type == null ? null : CacheRetrievalType.values()[(int) type]); + pigeonResult.setType(CacheRetrievalType.values()[(int) type]); Object error = list.get(1); pigeonResult.setError((error == null) ? null : CacheRetrievalError.fromList((ArrayList) error)); Object paths = list.get(2); @@ -644,10 +666,28 @@ ArrayList toList() { } } + /** Asynchronous error handling return type for non-nullable API method returns. */ public interface Result { - @SuppressWarnings("UnknownNullness") - void success(T result); + /** Success case callback method for handling returns. */ + void success(@NonNull T result); + + /** Failure case callback method for handling errors. */ + void error(@NonNull Throwable error); + } + /** Asynchronous error handling return type for nullable API method returns. */ + public interface NullableResult { + /** Success case callback method for handling returns. */ + void success(@Nullable T result); + + /** Failure case callback method for handling errors. */ + void error(@NonNull Throwable error); + } + /** Asynchronous error handling return type for void API method returns. */ + public interface VoidResult { + /** Success case callback method for handling returns. */ + void success(); + /** Failure case callback method for handling errors. */ void error(@NonNull Throwable error); } @@ -739,12 +779,12 @@ public interface ImagePickerApi { return ImagePickerApiCodec.INSTANCE; } /**Sets up an instance of `ImagePickerApi` to handle messages through the `binaryMessenger`. */ - static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImagePickerApi api) { + static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable ImagePickerApi api) { { BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ImagePickerApi.pickImages", getCodec(), taskQueue); + binaryMessenger, "dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickImages", getCodec(), taskQueue); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -776,7 +816,7 @@ public void error(Throwable error) { BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ImagePickerApi.pickVideos", getCodec(), taskQueue); + binaryMessenger, "dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickVideos", getCodec(), taskQueue); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -807,7 +847,7 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ImagePickerApi.pickMedia", getCodec()); + binaryMessenger, "dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickMedia", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -838,7 +878,7 @@ public void error(Throwable error) { BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ImagePickerApi.retrieveLostResults", getCodec(), taskQueue); + binaryMessenger, "dev.flutter.pigeon.image_picker_android.ImagePickerApi.retrieveLostResults", getCodec(), taskQueue); if (api != null) { channel.setMessageHandler( (message, reply) -> { diff --git a/packages/image_picker/image_picker_android/lib/src/messages.g.dart b/packages/image_picker/image_picker_android/lib/src/messages.g.dart index 9dbf07d3c86..1466b15aee8 100644 --- a/packages/image_picker/image_picker_android/lib/src/messages.g.dart +++ b/packages/image_picker/image_picker_android/lib/src/messages.g.dart @@ -1,9 +1,9 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v9.2.5), do not edit directly. +// Autogenerated from Pigeon (v17.0.0), do not edit directly. // See also: https://pub.dev/packages/pigeon -// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import +// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers import 'dart:async'; import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; @@ -11,6 +11,24 @@ import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer; import 'package:flutter/services.dart'; +PlatformException _createConnectionError(String channelName) { + return PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel: "$channelName".', + ); +} + +List wrapResponse( + {Object? result, PlatformException? error, bool empty = false}) { + if (empty) { + return []; + } + if (error == null) { + return [result]; + } + return [error.code, error.message, error.details]; +} + enum SourceCamera { rear, front, @@ -200,7 +218,7 @@ class CacheRetrievalResult { CacheRetrievalResult({ required this.type, this.error, - required this.paths, + this.paths = const [], }); /// The type of the retrieved data. @@ -293,43 +311,43 @@ class ImagePickerApi { /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. ImagePickerApi({BinaryMessenger? binaryMessenger}) - : _binaryMessenger = binaryMessenger; - final BinaryMessenger? _binaryMessenger; + : __pigeon_binaryMessenger = binaryMessenger; + final BinaryMessenger? __pigeon_binaryMessenger; - static const MessageCodec codec = _ImagePickerApiCodec(); + static const MessageCodec pigeonChannelCodec = + _ImagePickerApiCodec(); /// Selects images and returns their paths. /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickImages( - SourceSpecification arg_source, - ImageSelectionOptions arg_options, - GeneralOptions arg_generalOptions) async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ImagePickerApi.pickImages', codec, - binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_source, arg_options, arg_generalOptions]) - as List?; - if (replyList == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - ); - } else if (replyList.length > 1) { + Future> pickImages(SourceSpecification source, + ImageSelectionOptions options, GeneralOptions generalOptions) async { + const String __pigeon_channelName = + 'dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickImages'; + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( + __pigeon_channelName, + pigeonChannelCodec, + binaryMessenger: __pigeon_binaryMessenger, + ); + final List? __pigeon_replyList = await __pigeon_channel + .send([source, options, generalOptions]) as List?; + if (__pigeon_replyList == null) { + throw _createConnectionError(__pigeon_channelName); + } else if (__pigeon_replyList.length > 1) { throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], + code: __pigeon_replyList[0]! as String, + message: __pigeon_replyList[1] as String?, + details: __pigeon_replyList[2], ); - } else if (replyList[0] == null) { + } else if (__pigeon_replyList[0] == null) { throw PlatformException( code: 'null-error', message: 'Host platform returned null value for non-null return value.', ); } else { - return (replyList[0] as List?)!.cast(); + return (__pigeon_replyList[0] as List?)!.cast(); } } @@ -337,34 +355,33 @@ class ImagePickerApi { /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickVideos( - SourceSpecification arg_source, - VideoSelectionOptions arg_options, - GeneralOptions arg_generalOptions) async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ImagePickerApi.pickVideos', codec, - binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_source, arg_options, arg_generalOptions]) - as List?; - if (replyList == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - ); - } else if (replyList.length > 1) { + Future> pickVideos(SourceSpecification source, + VideoSelectionOptions options, GeneralOptions generalOptions) async { + const String __pigeon_channelName = + 'dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickVideos'; + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( + __pigeon_channelName, + pigeonChannelCodec, + binaryMessenger: __pigeon_binaryMessenger, + ); + final List? __pigeon_replyList = await __pigeon_channel + .send([source, options, generalOptions]) as List?; + if (__pigeon_replyList == null) { + throw _createConnectionError(__pigeon_channelName); + } else if (__pigeon_replyList.length > 1) { throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], + code: __pigeon_replyList[0]! as String, + message: __pigeon_replyList[1] as String?, + details: __pigeon_replyList[2], ); - } else if (replyList[0] == null) { + } else if (__pigeon_replyList[0] == null) { throw PlatformException( code: 'null-error', message: 'Host platform returned null value for non-null return value.', ); } else { - return (replyList[0] as List?)!.cast(); + return (__pigeon_replyList[0] as List?)!.cast(); } } @@ -372,55 +389,59 @@ class ImagePickerApi { /// /// Elements must not be null, by convention. See /// https://github.com/flutter/flutter/issues/97848 - Future> pickMedia( - MediaSelectionOptions arg_mediaSelectionOptions, - GeneralOptions arg_generalOptions) async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ImagePickerApi.pickMedia', codec, - binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_mediaSelectionOptions, arg_generalOptions]) + Future> pickMedia(MediaSelectionOptions mediaSelectionOptions, + GeneralOptions generalOptions) async { + const String __pigeon_channelName = + 'dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickMedia'; + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( + __pigeon_channelName, + pigeonChannelCodec, + binaryMessenger: __pigeon_binaryMessenger, + ); + final List? __pigeon_replyList = await __pigeon_channel + .send([mediaSelectionOptions, generalOptions]) as List?; - if (replyList == null) { + if (__pigeon_replyList == null) { + throw _createConnectionError(__pigeon_channelName); + } else if (__pigeon_replyList.length > 1) { throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', + code: __pigeon_replyList[0]! as String, + message: __pigeon_replyList[1] as String?, + details: __pigeon_replyList[2], ); - } else if (replyList.length > 1) { - throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], - ); - } else if (replyList[0] == null) { + } else if (__pigeon_replyList[0] == null) { throw PlatformException( code: 'null-error', message: 'Host platform returned null value for non-null return value.', ); } else { - return (replyList[0] as List?)!.cast(); + return (__pigeon_replyList[0] as List?)!.cast(); } } /// Returns results from a previous app session, if any. Future retrieveLostResults() async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ImagePickerApi.retrieveLostResults', codec, - binaryMessenger: _binaryMessenger); - final List? replyList = await channel.send(null) as List?; - if (replyList == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - ); - } else if (replyList.length > 1) { + const String __pigeon_channelName = + 'dev.flutter.pigeon.image_picker_android.ImagePickerApi.retrieveLostResults'; + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( + __pigeon_channelName, + pigeonChannelCodec, + binaryMessenger: __pigeon_binaryMessenger, + ); + final List? __pigeon_replyList = + await __pigeon_channel.send(null) as List?; + if (__pigeon_replyList == null) { + throw _createConnectionError(__pigeon_channelName); + } else if (__pigeon_replyList.length > 1) { throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], + code: __pigeon_replyList[0]! as String, + message: __pigeon_replyList[1] as String?, + details: __pigeon_replyList[2], ); } else { - return (replyList[0] as CacheRetrievalResult?); + return (__pigeon_replyList[0] as CacheRetrievalResult?); } } } diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml index b7b4a147fe3..b98a83d6c9f 100755 --- a/packages/image_picker/image_picker_android/pubspec.yaml +++ b/packages/image_picker/image_picker_android/pubspec.yaml @@ -27,7 +27,7 @@ dev_dependencies: flutter_test: sdk: flutter mockito: 5.4.4 - pigeon: ^9.2.5 + pigeon: ^17.0.0 topics: - camera diff --git a/packages/image_picker/image_picker_android/test/test_api.g.dart b/packages/image_picker/image_picker_android/test/test_api.g.dart index d3b68913a68..52aefcd0faa 100644 --- a/packages/image_picker/image_picker_android/test/test_api.g.dart +++ b/packages/image_picker/image_picker_android/test/test_api.g.dart @@ -1,9 +1,9 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v9.2.5), do not edit directly. +// Autogenerated from Pigeon (v17.0.0), do not edit directly. // See also: https://pub.dev/packages/pigeon -// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, unnecessary_import +// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, unnecessary_import, no_leading_underscores_for_local_identifiers // ignore_for_file: avoid_relative_lib_imports import 'dart:async'; import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; @@ -69,7 +69,8 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { abstract class TestHostImagePickerApi { static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; - static const MessageCodec codec = _TestHostImagePickerApiCodec(); + static const MessageCodec pigeonChannelCodec = + _TestHostImagePickerApiCodec(); /// Selects images and returns their paths. /// @@ -98,111 +99,146 @@ abstract class TestHostImagePickerApi { static void setup(TestHostImagePickerApi? api, {BinaryMessenger? binaryMessenger}) { { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ImagePickerApi.pickImages', codec, + final BasicMessageChannel __pigeon_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickImages', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + .setMockDecodedMessageHandler(__pigeon_channel, null); } else { _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, + .setMockDecodedMessageHandler(__pigeon_channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null.'); + 'Argument for dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickImages was null.'); final List args = (message as List?)!; final SourceSpecification? arg_source = (args[0] as SourceSpecification?); assert(arg_source != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null, expected non-null SourceSpecification.'); + 'Argument for dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickImages was null, expected non-null SourceSpecification.'); final ImageSelectionOptions? arg_options = (args[1] as ImageSelectionOptions?); assert(arg_options != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null, expected non-null ImageSelectionOptions.'); + 'Argument for dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickImages was null, expected non-null ImageSelectionOptions.'); final GeneralOptions? arg_generalOptions = (args[2] as GeneralOptions?); assert(arg_generalOptions != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickImages was null, expected non-null GeneralOptions.'); - final List output = await api.pickImages( - arg_source!, arg_options!, arg_generalOptions!); - return [output]; + 'Argument for dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickImages was null, expected non-null GeneralOptions.'); + try { + final List output = await api.pickImages( + arg_source!, arg_options!, arg_generalOptions!); + return [output]; + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); + } }); } } { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ImagePickerApi.pickVideos', codec, + final BasicMessageChannel __pigeon_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickVideos', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + .setMockDecodedMessageHandler(__pigeon_channel, null); } else { _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, + .setMockDecodedMessageHandler(__pigeon_channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null.'); + 'Argument for dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickVideos was null.'); final List args = (message as List?)!; final SourceSpecification? arg_source = (args[0] as SourceSpecification?); assert(arg_source != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null, expected non-null SourceSpecification.'); + 'Argument for dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickVideos was null, expected non-null SourceSpecification.'); final VideoSelectionOptions? arg_options = (args[1] as VideoSelectionOptions?); assert(arg_options != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null, expected non-null VideoSelectionOptions.'); + 'Argument for dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickVideos was null, expected non-null VideoSelectionOptions.'); final GeneralOptions? arg_generalOptions = (args[2] as GeneralOptions?); assert(arg_generalOptions != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideos was null, expected non-null GeneralOptions.'); - final List output = await api.pickVideos( - arg_source!, arg_options!, arg_generalOptions!); - return [output]; + 'Argument for dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickVideos was null, expected non-null GeneralOptions.'); + try { + final List output = await api.pickVideos( + arg_source!, arg_options!, arg_generalOptions!); + return [output]; + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); + } }); } } { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ImagePickerApi.pickMedia', codec, + final BasicMessageChannel __pigeon_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickMedia', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + .setMockDecodedMessageHandler(__pigeon_channel, null); } else { _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, + .setMockDecodedMessageHandler(__pigeon_channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickMedia was null.'); + 'Argument for dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickMedia was null.'); final List args = (message as List?)!; final MediaSelectionOptions? arg_mediaSelectionOptions = (args[0] as MediaSelectionOptions?); assert(arg_mediaSelectionOptions != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickMedia was null, expected non-null MediaSelectionOptions.'); + 'Argument for dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickMedia was null, expected non-null MediaSelectionOptions.'); final GeneralOptions? arg_generalOptions = (args[1] as GeneralOptions?); assert(arg_generalOptions != null, - 'Argument for dev.flutter.pigeon.ImagePickerApi.pickMedia was null, expected non-null GeneralOptions.'); - final List output = await api.pickMedia( - arg_mediaSelectionOptions!, arg_generalOptions!); - return [output]; + 'Argument for dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickMedia was null, expected non-null GeneralOptions.'); + try { + final List output = await api.pickMedia( + arg_mediaSelectionOptions!, arg_generalOptions!); + return [output]; + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); + } }); } } { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ImagePickerApi.retrieveLostResults', codec, + final BasicMessageChannel __pigeon_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.image_picker_android.ImagePickerApi.retrieveLostResults', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + .setMockDecodedMessageHandler(__pigeon_channel, null); } else { _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, + .setMockDecodedMessageHandler(__pigeon_channel, (Object? message) async { - // ignore message - final CacheRetrievalResult? output = api.retrieveLostResults(); - return [output]; + try { + final CacheRetrievalResult? output = api.retrieveLostResults(); + return [output]; + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); + } }); } } From 36083e4445b210c9b7a556561df0ba47b669f946 Mon Sep 17 00:00:00 2001 From: pdenert Date: Mon, 26 Feb 2024 15:07:12 +0100 Subject: [PATCH 08/45] Update pubspec versions and changelog --- packages/image_picker/image_picker/CHANGELOG.md | 1 + packages/image_picker/image_picker/pubspec.yaml | 2 +- packages/image_picker/image_picker_android/CHANGELOG.md | 4 ++++ packages/image_picker/image_picker_android/pubspec.yaml | 2 +- packages/image_picker/image_picker_ios/CHANGELOG.md | 4 ++++ packages/image_picker/image_picker_ios/pubspec.yaml | 2 +- packages/image_picker/image_picker_linux/CHANGELOG.md | 3 ++- packages/image_picker/image_picker_linux/pubspec.yaml | 2 +- packages/image_picker/image_picker_macos/CHANGELOG.md | 3 ++- packages/image_picker/image_picker_macos/pubspec.yaml | 2 +- packages/image_picker/image_picker_windows/CHANGELOG.md | 3 ++- packages/image_picker/image_picker_windows/pubspec.yaml | 2 +- 12 files changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index 90f2406dacf..f66f7a589ba 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,5 +1,6 @@ ## 1.0.8 +* Add limit parameter to `pickMultiImage` and `pickMultipleMedia` to ios and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. * Updates support matrix in README to indicate that iOS 11 is no longer supported. * Clients on versions of Flutter that still support iOS 11 can continue to use this diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index 2d122e7321d..ba77914a2ca 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for selecting images from the Android and iOS image library, and taking new pictures with the camera. repository: https://github.com/flutter/packages/tree/main/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: 1.0.8 +version: 1.1.0 environment: sdk: ^3.1.0 diff --git a/packages/image_picker/image_picker_android/CHANGELOG.md b/packages/image_picker/image_picker_android/CHANGELOG.md index 5ffcad5de19..383dea752d3 100644 --- a/packages/image_picker/image_picker_android/CHANGELOG.md +++ b/packages/image_picker/image_picker_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.10 + +* Add limit parameter to `pickMultiImage` and `pickMultipleMedia` to ios and Android. + ## 0.8.9+6 * Updates minSdkVersion to 19. diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml index b98a83d6c9f..e9b6a66e8d9 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/packages/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.9+6 +version: 0.8.10 environment: sdk: ^3.2.0 diff --git a/packages/image_picker/image_picker_ios/CHANGELOG.md b/packages/image_picker/image_picker_ios/CHANGELOG.md index 566aab0f686..06e75f7dc93 100644 --- a/packages/image_picker/image_picker_ios/CHANGELOG.md +++ b/packages/image_picker/image_picker_ios/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.10 + +* Add limit parameter to `pickMultiImage` and `pickMultipleMedia` to ios and Android. + ## 0.8.9+2 * Updates minimum iOS version to 12.0 and minimum Flutter version to 3.16.6. diff --git a/packages/image_picker/image_picker_ios/pubspec.yaml b/packages/image_picker/image_picker_ios/pubspec.yaml index 6411dabdf26..f3a4dc89c72 100755 --- a/packages/image_picker/image_picker_ios/pubspec.yaml +++ b/packages/image_picker/image_picker_ios/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_ios description: iOS implementation of the image_picker plugin. repository: https://github.com/flutter/packages/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.9+2 +version: 0.8.10 environment: sdk: ^3.2.3 diff --git a/packages/image_picker/image_picker_linux/CHANGELOG.md b/packages/image_picker/image_picker_linux/CHANGELOG.md index 3fc7283141e..15b5239e65b 100644 --- a/packages/image_picker/image_picker_linux/CHANGELOG.md +++ b/packages/image_picker/image_picker_linux/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.2.2 +* Add limit parameter to `pickMultiImage` and `pickMultipleMedia` to ios and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. ## 0.2.1+1 diff --git a/packages/image_picker/image_picker_linux/pubspec.yaml b/packages/image_picker/image_picker_linux/pubspec.yaml index 9e0ad116044..683ad119c4b 100644 --- a/packages/image_picker/image_picker_linux/pubspec.yaml +++ b/packages/image_picker/image_picker_linux/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_linux description: Linux platform implementation of image_picker repository: https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_linux issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.2.1+1 +version: 0.2.2 environment: sdk: ^3.1.0 diff --git a/packages/image_picker/image_picker_macos/CHANGELOG.md b/packages/image_picker/image_picker_macos/CHANGELOG.md index 2213848edf9..8e90b931d8c 100644 --- a/packages/image_picker/image_picker_macos/CHANGELOG.md +++ b/packages/image_picker/image_picker_macos/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.2.2 +* Add limit parameter to `pickMultiImage` and `pickMultipleMedia` to ios and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. ## 0.2.1+1 diff --git a/packages/image_picker/image_picker_macos/pubspec.yaml b/packages/image_picker/image_picker_macos/pubspec.yaml index 70217d847be..ea8a72a625b 100644 --- a/packages/image_picker/image_picker_macos/pubspec.yaml +++ b/packages/image_picker/image_picker_macos/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_macos description: macOS platform implementation of image_picker repository: https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_macos issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.2.1+1 +version: 0.2.2 environment: sdk: ^3.1.0 diff --git a/packages/image_picker/image_picker_windows/CHANGELOG.md b/packages/image_picker/image_picker_windows/CHANGELOG.md index 8575f8064c3..119d7fd49dc 100644 --- a/packages/image_picker/image_picker_windows/CHANGELOG.md +++ b/packages/image_picker/image_picker_windows/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.2.2 +* Add limit parameter to `pickMultiImage` and `pickMultipleMedia` to ios and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. ## 0.2.1+1 diff --git a/packages/image_picker/image_picker_windows/pubspec.yaml b/packages/image_picker/image_picker_windows/pubspec.yaml index 02f0f80ca3a..061f3533ebd 100644 --- a/packages/image_picker/image_picker_windows/pubspec.yaml +++ b/packages/image_picker/image_picker_windows/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_windows description: Windows platform implementation of image_picker repository: https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_windows issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.2.1+1 +version: 0.2.2 environment: sdk: ^3.1.0 From 8f8c169877f4f8b65b020c8795415416786deca3 Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 27 Feb 2024 01:48:20 +0100 Subject: [PATCH 09/45] Add tests --- .../image_picker/test/image_picker_test.dart | 102 ++++++++++- .../lib/image_picker_android.dart | 8 +- .../test/image_picker_android_test.dart | 58 +++++++ .../test/image_picker_ios_test.dart | 162 ++++++++++++++++-- .../method_channel_image_picker.dart | 5 + .../image_picker_platform.dart | 1 + .../method_channel_image_picker_test.dart | 52 ++++++ 7 files changed, 374 insertions(+), 14 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 4ff5b4e025d..c087c3b0be3 100644 --- a/packages/image_picker/image_picker/test/image_picker_test.dart +++ b/packages/image_picker/image_picker/test/image_picker_test.dart @@ -431,7 +431,16 @@ void main() { imageQuality: 70, ); await picker.pickMultiImage( - maxWidth: 10.0, maxHeight: 20.0, imageQuality: 70); + maxWidth: 10.0, + maxHeight: 20.0, + imageQuality: 70, + ); + await picker.pickMultiImage( + maxWidth: 10.0, + maxHeight: 20.0, + imageQuality: 70, + limit: 5, + ); verifyInOrder([ mockPlatform.getMultiImageWithOptions( @@ -529,6 +538,29 @@ void main() { named: 'options', ), ), + mockPlatform.getMultiImageWithOptions( + options: argThat( + isInstanceOf() + .having( + (MultiImagePickerOptions options) => + options.imageOptions.maxWidth, + 'maxWidth', + equals(10.0)) + .having( + (MultiImagePickerOptions options) => + options.imageOptions.maxWidth, + 'maxHeight', + equals(10.0)) + .having( + (MultiImagePickerOptions options) => + options.imageOptions.imageQuality, + 'imageQuality', + equals(70)) + .having((MultiImagePickerOptions options) => options.limit, + 'limit', equals(5)), + named: 'options', + ), + ), ]); }); @@ -545,6 +577,19 @@ void main() { ); }); + test('does not accept a negative or zero limit argument', () { + final ImagePicker picker = ImagePicker(); + expect( + () => picker.pickMultiImage(limit: -1), + throwsArgumentError, + ); + + expect( + () => picker.pickMultiImage(limit: 0), + throwsArgumentError, + ); + }); + test('handles an empty image file response gracefully', () async { final ImagePicker picker = ImagePicker(); @@ -620,7 +665,15 @@ void main() { imageQuality: 70, ); await picker.pickMedia( - maxWidth: 10.0, maxHeight: 20.0, imageQuality: 70); + maxWidth: 10.0, + maxHeight: 20.0, + imageQuality: 70, + ); + await picker.pickMedia( + maxWidth: 10.0, + maxHeight: 20.0, + imageQuality: 70, + ); verifyInOrder([ mockPlatform.getMedia( @@ -793,7 +846,16 @@ void main() { imageQuality: 70, ); await picker.pickMultipleMedia( - maxWidth: 10.0, maxHeight: 20.0, imageQuality: 70); + maxWidth: 10.0, + maxHeight: 20.0, + imageQuality: 70, + ); + await picker.pickMultipleMedia( + maxWidth: 10.0, + maxHeight: 20.0, + imageQuality: 70, + limit: 5, + ); verifyInOrder([ mockPlatform.getMedia( @@ -885,6 +947,27 @@ void main() { named: 'options', ), ), + mockPlatform.getMedia( + options: argThat( + isInstanceOf() + .having( + (MediaOptions options) => options.imageOptions.maxWidth, + 'maxWidth', + equals(10.0)) + .having( + (MediaOptions options) => options.imageOptions.maxWidth, + 'maxHeight', + equals(10.0)) + .having( + (MediaOptions options) => + options.imageOptions.imageQuality, + 'imageQuality', + equals(70)) + .having((MediaOptions options) => options.limit, 'limit', + equals(5)), + named: 'options', + ), + ), ]); }); @@ -901,6 +984,19 @@ void main() { ); }); + test('does not accept a negative or zero limit argument', () { + final ImagePicker picker = ImagePicker(); + expect( + () => picker.pickMultipleMedia(limit: -1), + throwsArgumentError, + ); + + expect( + () => picker.pickMultipleMedia(limit: 0), + throwsArgumentError, + ); + }); + test('handles an empty image file response gracefully', () async { final ImagePicker picker = ImagePicker(); diff --git a/packages/image_picker/image_picker_android/lib/image_picker_android.dart b/packages/image_picker/image_picker_android/lib/image_picker_android.dart index 6ee6dfa2dd8..1786ccc9fbb 100644 --- a/packages/image_picker/image_picker_android/lib/image_picker_android.dart +++ b/packages/image_picker/image_picker_android/lib/image_picker_android.dart @@ -84,7 +84,7 @@ class ImagePickerAndroid extends ImagePickerPlatform { throw ArgumentError.value(maxHeight, 'maxHeight', 'cannot be negative'); } - if (limit != null && limit < 0) { + if (limit != null && limit < 1) { throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); } @@ -255,6 +255,12 @@ class ImagePickerAndroid extends ImagePickerPlatform { final ImageSelectionOptions imageSelectionOptions = _imageOptionsToImageSelectionOptionsWithValidator( mediaOptions.imageOptions); + + final int? limit = mediaOptions.limit; + if (limit != null && limit < 1) { + throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); + } + return MediaSelectionOptions( imageSelectionOptions: imageSelectionOptions, ); diff --git a/packages/image_picker/image_picker_android/test/image_picker_android_test.dart b/packages/image_picker/image_picker_android/test/image_picker_android_test.dart index 0b0cab4d6df..1e1387988fe 100644 --- a/packages/image_picker/image_picker_android/test/image_picker_android_test.dart +++ b/packages/image_picker/image_picker_android/test/image_picker_android_test.dart @@ -156,6 +156,7 @@ void main() { expect(api.passedImageOptions?.maxWidth, null); expect(api.passedImageOptions?.maxHeight, null); expect(api.passedImageOptions?.quality, 100); + expect(api.limit, null); }); test('passes image option arguments correctly', () async { @@ -163,11 +164,13 @@ void main() { maxWidth: 10.0, maxHeight: 20.0, imageQuality: 70, + limit: 5, ); expect(api.passedImageOptions?.maxWidth, 10.0); expect(api.passedImageOptions?.maxHeight, 20.0); expect(api.passedImageOptions?.quality, 70); + expect(api.limit, 5); }); test('does not accept a negative width or height argument', () { @@ -194,6 +197,18 @@ void main() { ); }); + test('does not accept an invalid limit argument', () { + expect( + () => picker.pickMultiImage(limit: -1), + throwsArgumentError, + ); + + expect( + () => picker.pickMultiImage(limit: 0), + throwsArgumentError, + ); + }); + test('handles an empty path response gracefully', () async { api.returnValue = []; @@ -465,6 +480,7 @@ void main() { expect(api.passedImageOptions?.maxWidth, null); expect(api.passedImageOptions?.maxHeight, null); expect(api.passedImageOptions?.quality, 100); + expect(api.limit, null); }); test('passes image option arguments correctly', () async { @@ -472,11 +488,13 @@ void main() { maxWidth: 10.0, maxHeight: 20.0, imageQuality: 70, + limit: 5, ); expect(api.passedImageOptions?.maxWidth, 10.0); expect(api.passedImageOptions?.maxHeight, 20.0); expect(api.passedImageOptions?.quality, 70); + expect(api.limit, 5); }); test('does not accept a negative width or height argument', () { @@ -503,6 +521,18 @@ void main() { ); }); + test('does not accept an invalid limit argument', () { + expect( + () => picker.getMultiImage(limit: -1), + throwsArgumentError, + ); + + expect( + () => picker.getMultiImage(limit: 0), + throwsArgumentError, + ); + }); + test('handles an empty image path response gracefully', () async { api.returnValue = []; @@ -681,6 +711,7 @@ void main() { expect(api.passedImageOptions?.maxWidth, null); expect(api.passedImageOptions?.maxHeight, null); expect(api.passedImageOptions?.quality, 100); + expect(api.limit, null); }); test('passes image option arguments correctly', () async { @@ -692,11 +723,13 @@ void main() { maxHeight: 20.0, imageQuality: 70, ), + limit: 5, )); expect(api.passedImageOptions?.maxWidth, 10.0); expect(api.passedImageOptions?.maxHeight, 20.0); expect(api.passedImageOptions?.quality, 70); + expect(api.limit, 5); }); test('does not accept a negative width or height argument', () { @@ -743,6 +776,28 @@ void main() { ); }); + test('does not accept an invalid limit argument', () { + expect( + () => picker.getMedia( + options: const MediaOptions( + allowMultiple: true, + limit: -1, + ), + ), + throwsArgumentError, + ); + + expect( + () => picker.getMedia( + options: const MediaOptions( + allowMultiple: true, + limit: 0, + ), + ), + throwsArgumentError, + ); + }); + test('handles an empty path response gracefully', () async { api.returnValue = []; @@ -926,6 +981,7 @@ class _FakeImagePickerApi implements ImagePickerApi { VideoSelectionOptions? passedVideoOptions; bool? passedAllowMultiple; bool? passedPhotoPickerFlag; + int? limit; _LastPickType? lastCall; @override @@ -939,6 +995,7 @@ class _FakeImagePickerApi implements ImagePickerApi { passedImageOptions = options; passedAllowMultiple = generalOptions.allowMultiple; passedPhotoPickerFlag = generalOptions.usePhotoPicker; + limit = generalOptions.limit; return returnValue as List? ?? []; } @@ -951,6 +1008,7 @@ class _FakeImagePickerApi implements ImagePickerApi { passedImageOptions = options.imageSelectionOptions; passedPhotoPickerFlag = generalOptions.usePhotoPicker; passedAllowMultiple = generalOptions.allowMultiple; + limit = generalOptions.limit; return returnValue as List? ?? []; } diff --git a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart index 852f5626294..d6128d33151 100644 --- a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart +++ b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart @@ -82,6 +82,7 @@ class _ApiLogger implements TestHostImagePickerApi { 'imageQuality': mediaSelectionOptions.imageQuality, 'requestFullMetadata': mediaSelectionOptions.requestFullMetadata, 'allowMultiple': mediaSelectionOptions.allowMultiple, + 'limit': mediaSelectionOptions.limit, })); return returnValue as List; } @@ -363,6 +364,12 @@ void main() { maxHeight: 20.0, imageQuality: 70, ); + await picker.pickMultiImage( + maxWidth: 10.0, + maxHeight: 20.0, + imageQuality: 70, + limit: 5, + ); expect( log.calls, @@ -423,6 +430,14 @@ void main() { 'requestFullMetadata': true, 'limit': null, }), + const _LoggedMethodCall('pickMultiImage', + arguments: { + 'maxWidth': 10.0, + 'maxHeight': 20.0, + 'imageQuality': 70, + 'requestFullMetadata': true, + 'limit': 5, + }), ], ); }); @@ -451,6 +466,18 @@ void main() { ); }); + test('does not accept a invalid limit argument', () { + expect( + () => picker.pickMultiImage(limit: -1), + throwsArgumentError, + ); + + expect( + () => picker.pickMultiImage(limit: 0), + throwsArgumentError, + ); + }); + test('returns null for an empty list', () async { log.returnValue = []; @@ -811,6 +838,12 @@ void main() { maxHeight: 20.0, imageQuality: 70, ); + await picker.getMultiImage( + maxWidth: 10.0, + maxHeight: 20.0, + imageQuality: 70, + limit: 5, + ); expect( log.calls, @@ -871,6 +904,14 @@ void main() { 'requestFullMetadata': true, 'limit': null, }), + const _LoggedMethodCall('pickMultiImage', + arguments: { + 'maxWidth': 10.0, + 'maxHeight': 20.0, + 'imageQuality': 70, + 'requestFullMetadata': true, + 'limit': 5, + }), ], ); }); @@ -901,6 +942,19 @@ void main() { ); }); + test('does not accept a invalid limit argument', () { + log.returnValue = ['0', '1']; + expect( + () => picker.getMultiImage(limit: -1), + throwsArgumentError, + ); + + expect( + () => picker.getMultiImage(limit: 0), + throwsArgumentError, + ); + }); + test('returns null for an empty list', () async { log.returnValue = []; @@ -921,7 +975,8 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, - 'allowMultiple': true + 'allowMultiple': true, + 'limit': null, }), ], ); @@ -977,6 +1032,16 @@ void main() { imageQuality: 70, ), )); + await picker.getMedia( + options: MediaOptions( + allowMultiple: true, + imageOptions: ImageOptions.createAndValidate( + maxWidth: 10.0, + maxHeight: 20.0, + imageQuality: 70, + ), + limit: 5, + )); expect( log.calls, @@ -986,49 +1051,64 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, - 'allowMultiple': true + 'allowMultiple': true, + 'limit': null, }), const _LoggedMethodCall('pickMedia', arguments: { 'maxWidth': 10.0, 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, - 'allowMultiple': true + 'allowMultiple': true, + 'limit': null, }), const _LoggedMethodCall('pickMedia', arguments: { 'maxWidth': null, 'maxHeight': 10.0, 'imageQuality': null, 'requestFullMetadata': true, - 'allowMultiple': true + 'allowMultiple': true, + 'limit': null, }), const _LoggedMethodCall('pickMedia', arguments: { 'maxWidth': 10.0, 'maxHeight': 20.0, 'imageQuality': null, 'requestFullMetadata': true, - 'allowMultiple': true + 'allowMultiple': true, + 'limit': null, }), const _LoggedMethodCall('pickMedia', arguments: { 'maxWidth': 10.0, 'maxHeight': null, 'imageQuality': 70, 'requestFullMetadata': true, - 'allowMultiple': true + 'allowMultiple': true, + 'limit': null, }), const _LoggedMethodCall('pickMedia', arguments: { 'maxWidth': null, 'maxHeight': 10.0, 'imageQuality': 70, 'requestFullMetadata': true, - 'allowMultiple': true + 'allowMultiple': true, + 'limit': null, + }), + const _LoggedMethodCall('pickMedia', arguments: { + 'maxWidth': 10.0, + 'maxHeight': 20.0, + 'imageQuality': 70, + 'requestFullMetadata': true, + 'allowMultiple': true, + 'limit': null, }), const _LoggedMethodCall('pickMedia', arguments: { 'maxWidth': 10.0, 'maxHeight': 20.0, 'imageQuality': 70, 'requestFullMetadata': true, - 'allowMultiple': true + 'allowMultiple': true, + 'limit': 5, }), ], ); @@ -1050,7 +1130,8 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': false, - 'allowMultiple': true + 'allowMultiple': true, + 'limit': null, }), ], ); @@ -1071,7 +1152,8 @@ void main() { 'maxHeight': null, 'imageQuality': null, 'requestFullMetadata': true, - 'allowMultiple': false + 'allowMultiple': false, + 'limit': null, }), ], ); @@ -1119,6 +1201,27 @@ void main() { ); }); + test('does not accept a invalid limit argument', () { + log.returnValue = ['0', '1']; + expect( + () => picker.getMedia( + options: const MediaOptions( + allowMultiple: true, + limit: -1, + )), + throwsArgumentError, + ); + + expect( + () => picker.getMedia( + options: const MediaOptions( + allowMultiple: true, + limit: 0, + )), + throwsArgumentError, + ); + }); + test('handles a empty path response gracefully', () async { log.returnValue = []; @@ -1562,6 +1665,16 @@ void main() { ), ), ); + await picker.getMultiImageWithOptions( + options: const MultiImagePickerOptions( + imageOptions: ImageOptions( + maxWidth: 10.0, + maxHeight: 20.0, + imageQuality: 70, + ), + limit: 5, + ), + ); expect( log.calls, @@ -1622,6 +1735,14 @@ void main() { 'requestFullMetadata': true, 'limit': null, }), + const _LoggedMethodCall('pickMultiImage', + arguments: { + 'maxWidth': 10.0, + 'maxHeight': 20.0, + 'imageQuality': 70, + 'requestFullMetadata': true, + 'limit': 5, + }), ], ); }); @@ -1668,6 +1789,27 @@ void main() { ); }); + test('does not accept a invalid limit argument', () { + log.returnValue = ['0', '1']; + expect( + () => picker.getMultiImageWithOptions( + options: const MultiImagePickerOptions( + limit: -1, + ), + ), + throwsArgumentError, + ); + + expect( + () => picker.getMultiImageWithOptions( + options: const MultiImagePickerOptions( + limit: 0, + ), + ), + throwsArgumentError, + ); + }); + test('handles an empty response', () async { log.returnValue = []; 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 a9cd8a5c924..87a3a0eebf5 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 @@ -269,6 +269,11 @@ class MethodChannelImagePicker extends ImagePickerPlatform { }) async { final ImageOptions imageOptions = options.imageOptions; + final int? limit = options.limit; + if (limit != null && limit < 1) { + throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); + } + final Map args = { 'maxImageWidth': imageOptions.maxWidth, 'maxImageHeight': imageOptions.maxHeight, 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 5fc1167cbd6..7550b509f5f 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 @@ -99,6 +99,7 @@ abstract class ImagePickerPlatform extends PlatformInterface { double? maxWidth, double? maxHeight, int? imageQuality, + int? limit, }) { throw UnimplementedError('pickMultiImage() has not been implemented.'); } 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 abc69671101..711791e2a23 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 @@ -279,6 +279,12 @@ void main() { maxHeight: 20.0, imageQuality: 70, ); + await picker.pickMultiImage( + maxWidth: 10.0, + maxHeight: 20.0, + imageQuality: 70, + limit: 5, + ); expect( log, @@ -332,6 +338,13 @@ void main() { 'requestFullMetadata': true, 'limit': null, }), + isMethodCall('pickMultiImage', arguments: { + 'maxWidth': 10.0, + 'maxHeight': 20.0, + 'imageQuality': 70, + 'requestFullMetadata': true, + 'limit': 5, + }), ], ); }); @@ -362,6 +375,19 @@ void main() { ); }); + test('does not accept an invalid limit argument', () { + returnValue = ['0', '1']; + expect( + () => picker.pickMultiImage(limit: -1), + throwsArgumentError, + ); + + expect( + () => picker.pickMultiImage(limit: 0), + throwsArgumentError, + ); + }); + test('handles a null image path response gracefully', () async { TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler( @@ -785,6 +811,12 @@ void main() { maxHeight: 20.0, imageQuality: 70, ); + await picker.getMultiImage( + maxWidth: 10.0, + maxHeight: 20.0, + imageQuality: 70, + limit: 5, + ); expect( log, @@ -838,6 +870,13 @@ void main() { 'requestFullMetadata': true, 'limit': null, }), + isMethodCall('pickMultiImage', arguments: { + 'maxWidth': 10.0, + 'maxHeight': 20.0, + 'imageQuality': 70, + 'requestFullMetadata': true, + 'limit': 5, + }), ], ); }); @@ -868,6 +907,19 @@ void main() { ); }); + test('does not accept an invalid limit argument', () { + returnValue = ['0', '1']; + expect( + () => picker.getMultiImage(limit: -1), + throwsArgumentError, + ); + + expect( + () => picker.getMultiImage(limit: 0), + throwsArgumentError, + ); + }); + test('handles a null image path response gracefully', () async { TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler( From 2dee0d1bb701eea7aca7ebd00f09ef08bcc8e604 Mon Sep 17 00:00:00 2001 From: pdenert Date: Thu, 29 Feb 2024 00:00:20 +0100 Subject: [PATCH 10/45] Update changelogs --- packages/image_picker/image_picker/CHANGELOG.md | 2 +- packages/image_picker/image_picker_android/CHANGELOG.md | 2 +- packages/image_picker/image_picker_ios/CHANGELOG.md | 2 +- packages/image_picker/image_picker_linux/CHANGELOG.md | 2 +- packages/image_picker/image_picker_macos/CHANGELOG.md | 2 +- packages/image_picker/image_picker_windows/CHANGELOG.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index f66f7a589ba..615d863a9e8 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,6 +1,6 @@ ## 1.0.8 -* Add limit parameter to `pickMultiImage` and `pickMultipleMedia` to ios and Android. +* Adds limit parameter to `pickMultiImage` and `pickMultipleMedia` to iOS and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. * Updates support matrix in README to indicate that iOS 11 is no longer supported. * Clients on versions of Flutter that still support iOS 11 can continue to use this diff --git a/packages/image_picker/image_picker_android/CHANGELOG.md b/packages/image_picker/image_picker_android/CHANGELOG.md index 383dea752d3..a5ca66b4e34 100644 --- a/packages/image_picker/image_picker_android/CHANGELOG.md +++ b/packages/image_picker/image_picker_android/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.8.10 -* Add limit parameter to `pickMultiImage` and `pickMultipleMedia` to ios and Android. +* Adds limit parameter to `pickMultiImage` and `pickMultipleMedia`. ## 0.8.9+6 diff --git a/packages/image_picker/image_picker_ios/CHANGELOG.md b/packages/image_picker/image_picker_ios/CHANGELOG.md index 06e75f7dc93..2a00b710b1c 100644 --- a/packages/image_picker/image_picker_ios/CHANGELOG.md +++ b/packages/image_picker/image_picker_ios/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.8.10 -* Add limit parameter to `pickMultiImage` and `pickMultipleMedia` to ios and Android. +* Adds limit parameter `pickMultiImage` and `pickMultipleMedia`. ## 0.8.9+2 diff --git a/packages/image_picker/image_picker_linux/CHANGELOG.md b/packages/image_picker/image_picker_linux/CHANGELOG.md index 15b5239e65b..6650715d7dd 100644 --- a/packages/image_picker/image_picker_linux/CHANGELOG.md +++ b/packages/image_picker/image_picker_linux/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.2.2 -* Add limit parameter to `pickMultiImage` and `pickMultipleMedia` to ios and Android. +* Adds limit parameter `pickMultiImage` and `pickMultipleMedia` to iOS and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. ## 0.2.1+1 diff --git a/packages/image_picker/image_picker_macos/CHANGELOG.md b/packages/image_picker/image_picker_macos/CHANGELOG.md index 8e90b931d8c..b5c324b9528 100644 --- a/packages/image_picker/image_picker_macos/CHANGELOG.md +++ b/packages/image_picker/image_picker_macos/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.2.2 -* Add limit parameter to `pickMultiImage` and `pickMultipleMedia` to ios and Android. +* Adds limit parameter `pickMultiImage` and `pickMultipleMedia` to iOS and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. ## 0.2.1+1 diff --git a/packages/image_picker/image_picker_windows/CHANGELOG.md b/packages/image_picker/image_picker_windows/CHANGELOG.md index 119d7fd49dc..6db696d9282 100644 --- a/packages/image_picker/image_picker_windows/CHANGELOG.md +++ b/packages/image_picker/image_picker_windows/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.2.2 -* Add limit parameter to `pickMultiImage` and `pickMultipleMedia` to ios and Android. +* Adds limit parameter `pickMultiImage` and `pickMultipleMedia` to iOS and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. ## 0.2.1+1 From bf7f1043b63d44151d215c59cf4cedf1b8eee471 Mon Sep 17 00:00:00 2001 From: pdenert Date: Thu, 29 Feb 2024 00:26:01 +0100 Subject: [PATCH 11/45] Remove limit argument, except from MultiImagePickerOptions --- .../method_channel_image_picker.dart | 8 +-- .../image_picker_platform.dart | 5 -- .../method_channel_image_picker_test.dart | 52 ------------------- 3 files changed, 2 insertions(+), 63 deletions(-) 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 87a3a0eebf5..074696b88a2 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 @@ -40,13 +40,11 @@ class MethodChannelImagePicker extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) async { final List? paths = await _getMultiImagePath( maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: imageQuality, - limit: limit, ); if (paths == null) { return null; @@ -75,8 +73,8 @@ class MethodChannelImagePicker extends ImagePickerPlatform { throw ArgumentError.value(maxHeight, 'maxHeight', 'cannot be negative'); } - if (limit != null && limit < 1) { - throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); + if (limit != null && limit < 2) { + throw ArgumentError.value(limit, 'limit', 'cannot be lower than 2'); } return _channel.invokeMethod?>( @@ -230,13 +228,11 @@ class MethodChannelImagePicker extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) async { final List? paths = await _getMultiImagePath( maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: imageQuality, - limit: limit, ); if (paths == null) { return null; 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 7550b509f5f..a31fbbab322 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 @@ -99,7 +99,6 @@ abstract class ImagePickerPlatform extends PlatformInterface { double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) { throw UnimplementedError('pickMultiImage() has not been implemented.'); } @@ -204,15 +203,12 @@ abstract class ImagePickerPlatform extends PlatformInterface { /// image types such as JPEG. If compression is not supported for the image that is picked, /// a warning message will be logged. /// - /// The `limit` argument defines how many images can be select. - /// /// If no images were picked, the return value is null. @Deprecated('Use getMultiImageWithOptions instead.') Future?> getMultiImage({ double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) { throw UnimplementedError('getMultiImage() has not been implemented.'); } @@ -322,7 +318,6 @@ abstract class ImagePickerPlatform extends PlatformInterface { maxWidth: options.imageOptions.maxWidth, maxHeight: options.imageOptions.maxHeight, imageQuality: options.imageOptions.imageQuality, - limit: options.limit, ); return pickedImages ?? []; } 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 711791e2a23..abc69671101 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 @@ -279,12 +279,6 @@ void main() { maxHeight: 20.0, imageQuality: 70, ); - await picker.pickMultiImage( - maxWidth: 10.0, - maxHeight: 20.0, - imageQuality: 70, - limit: 5, - ); expect( log, @@ -338,13 +332,6 @@ void main() { 'requestFullMetadata': true, 'limit': null, }), - isMethodCall('pickMultiImage', arguments: { - 'maxWidth': 10.0, - 'maxHeight': 20.0, - 'imageQuality': 70, - 'requestFullMetadata': true, - 'limit': 5, - }), ], ); }); @@ -375,19 +362,6 @@ void main() { ); }); - test('does not accept an invalid limit argument', () { - returnValue = ['0', '1']; - expect( - () => picker.pickMultiImage(limit: -1), - throwsArgumentError, - ); - - expect( - () => picker.pickMultiImage(limit: 0), - throwsArgumentError, - ); - }); - test('handles a null image path response gracefully', () async { TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler( @@ -811,12 +785,6 @@ void main() { maxHeight: 20.0, imageQuality: 70, ); - await picker.getMultiImage( - maxWidth: 10.0, - maxHeight: 20.0, - imageQuality: 70, - limit: 5, - ); expect( log, @@ -870,13 +838,6 @@ void main() { 'requestFullMetadata': true, 'limit': null, }), - isMethodCall('pickMultiImage', arguments: { - 'maxWidth': 10.0, - 'maxHeight': 20.0, - 'imageQuality': 70, - 'requestFullMetadata': true, - 'limit': 5, - }), ], ); }); @@ -907,19 +868,6 @@ void main() { ); }); - test('does not accept an invalid limit argument', () { - returnValue = ['0', '1']; - expect( - () => picker.getMultiImage(limit: -1), - throwsArgumentError, - ); - - expect( - () => picker.getMultiImage(limit: 0), - throwsArgumentError, - ); - }); - test('handles a null image path response gracefully', () async { TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler( From 684ff3be3e46bb05fb5380598d5f847277507bf5 Mon Sep 17 00:00:00 2001 From: pdenert Date: Thu, 29 Feb 2024 02:11:43 +0100 Subject: [PATCH 12/45] Add validation to MediaOptions and MultiImagePickerOptions --- .../image_picker/lib/image_picker.dart | 4 ++-- .../image_picker/test/image_picker_test.dart | 14 ++++++++++++-- .../lib/image_picker_android.dart | 7 ++++--- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/image_picker/image_picker/lib/image_picker.dart b/packages/image_picker/image_picker/lib/image_picker.dart index 55ebd9fd3a3..bc8eb430747 100755 --- a/packages/image_picker/image_picker/lib/image_picker.dart +++ b/packages/image_picker/image_picker/lib/image_picker.dart @@ -139,7 +139,7 @@ class ImagePicker { ); return platform.getMultiImageWithOptions( - options: MultiImagePickerOptions( + options: MultiImagePickerOptions.createAndValidate( imageOptions: imageOptions, limit: limit, ), @@ -245,7 +245,7 @@ class ImagePicker { bool requestFullMetadata = true, }) { return platform.getMedia( - options: MediaOptions( + options: MediaOptions.createAndValidate( allowMultiple: true, imageOptions: ImageOptions.createAndValidate( maxHeight: maxHeight, 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 c087c3b0be3..766b3808998 100644 --- a/packages/image_picker/image_picker/test/image_picker_test.dart +++ b/packages/image_picker/image_picker/test/image_picker_test.dart @@ -577,7 +577,7 @@ void main() { ); }); - test('does not accept a negative or zero limit argument', () { + test('does not accept a limit argument lower than 2', () { final ImagePicker picker = ImagePicker(); expect( () => picker.pickMultiImage(limit: -1), @@ -588,6 +588,11 @@ void main() { () => picker.pickMultiImage(limit: 0), throwsArgumentError, ); + + expect( + () => picker.pickMultiImage(limit: 1), + throwsArgumentError, + ); }); test('handles an empty image file response gracefully', () async { @@ -984,7 +989,7 @@ void main() { ); }); - test('does not accept a negative or zero limit argument', () { + test('does not accept a limit argument lower than 2', () { final ImagePicker picker = ImagePicker(); expect( () => picker.pickMultipleMedia(limit: -1), @@ -995,6 +1000,11 @@ void main() { () => picker.pickMultipleMedia(limit: 0), throwsArgumentError, ); + + expect( + () => picker.pickMultipleMedia(limit: 1), + throwsArgumentError, + ); }); test('handles an empty image file response gracefully', () async { diff --git a/packages/image_picker/image_picker_android/lib/image_picker_android.dart b/packages/image_picker/image_picker_android/lib/image_picker_android.dart index 1786ccc9fbb..8e9bd05974e 100644 --- a/packages/image_picker/image_picker_android/lib/image_picker_android.dart +++ b/packages/image_picker/image_picker_android/lib/image_picker_android.dart @@ -95,9 +95,10 @@ class ImagePickerAndroid extends ImagePickerPlatform { maxHeight: maxHeight, quality: imageQuality ?? 100), GeneralOptions( - allowMultiple: true, - usePhotoPicker: useAndroidPhotoPicker, - limit: limit), + allowMultiple: true, + usePhotoPicker: useAndroidPhotoPicker, + limit: limit, + ), ); } From 950a43fa350d3847737a30e182b68383b9ff4c1a Mon Sep 17 00:00:00 2001 From: pdenert Date: Thu, 29 Feb 2024 02:16:20 +0100 Subject: [PATCH 13/45] Update image picker test mocks --- .../image_picker/image_picker/test/image_picker_test.mocks.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/image_picker/image_picker/test/image_picker_test.mocks.dart b/packages/image_picker/image_picker/test/image_picker_test.mocks.dart index 0500c646c3a..dcd89d9ac45 100644 --- a/packages/image_picker/image_picker/test/image_picker_test.mocks.dart +++ b/packages/image_picker/image_picker/test/image_picker_test.mocks.dart @@ -158,7 +158,6 @@ class MockImagePickerPlatform extends _i1.Mock double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) => (super.noSuchMethod( Invocation.method( @@ -168,7 +167,6 @@ class MockImagePickerPlatform extends _i1.Mock #maxWidth: maxWidth, #maxHeight: maxHeight, #imageQuality: imageQuality, - #limit: limit, }, ), returnValue: _i4.Future?>.value(), From 99750d9ba7ccf3b9e106a2dc4c1cc17b8a12951f Mon Sep 17 00:00:00 2001 From: pdenert Date: Thu, 29 Feb 2024 02:35:13 +0100 Subject: [PATCH 14/45] Remove changes from web, linux, macos and windows --- .../image_picker_for_web/lib/image_picker_for_web.dart | 4 ---- packages/image_picker/image_picker_linux/CHANGELOG.md | 3 +-- .../image_picker_linux/lib/image_picker_linux.dart | 7 +++---- packages/image_picker/image_picker_linux/pubspec.yaml | 2 +- packages/image_picker/image_picker_macos/CHANGELOG.md | 3 +-- .../image_picker_macos/lib/image_picker_macos.dart | 7 +++---- packages/image_picker/image_picker_macos/pubspec.yaml | 2 +- packages/image_picker/image_picker_windows/CHANGELOG.md | 3 +-- .../image_picker_windows/lib/image_picker_windows.dart | 7 +++---- packages/image_picker/image_picker_windows/pubspec.yaml | 2 +- 10 files changed, 15 insertions(+), 25 deletions(-) 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 775bad67085..0241e0750a7 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 @@ -199,15 +199,12 @@ class ImagePickerPlugin extends ImagePickerPlatform { } /// Injects a file input, and returns a list of XFile images that the user selected locally. - /// `limit` arguments is not currently supported. If these argument is supplied, - /// it will be silently ignored. @override @Deprecated('Use getMultiImageWithOptions instead.') Future> getMultiImage({ double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) async { return getMultiImageWithOptions( options: MultiImagePickerOptions( @@ -216,7 +213,6 @@ class ImagePickerPlugin extends ImagePickerPlatform { maxHeight: maxHeight, imageQuality: imageQuality, ), - limit: limit, ), ); } diff --git a/packages/image_picker/image_picker_linux/CHANGELOG.md b/packages/image_picker/image_picker_linux/CHANGELOG.md index 6650715d7dd..3fc7283141e 100644 --- a/packages/image_picker/image_picker_linux/CHANGELOG.md +++ b/packages/image_picker/image_picker_linux/CHANGELOG.md @@ -1,6 +1,5 @@ -## 0.2.2 +## NEXT -* Adds limit parameter `pickMultiImage` and `pickMultipleMedia` to iOS and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. ## 0.2.1+1 diff --git a/packages/image_picker/image_picker_linux/lib/image_picker_linux.dart b/packages/image_picker/image_picker_linux/lib/image_picker_linux.dart index e73e1ff4563..72596ea931f 100644 --- a/packages/image_picker/image_picker_linux/lib/image_picker_linux.dart +++ b/packages/image_picker/image_picker_linux/lib/image_picker_linux.dart @@ -139,15 +139,14 @@ class ImagePickerLinux extends CameraDelegatingImagePickerPlatform { throw UnimplementedError('Unknown ImageSource: $source'); } - // `maxWidth`, `maxHeight`, `imageQuality`, and `limit` arguments are not - // currently supported. If any of these arguments are supplied, they will - // be silently ignored. + // `maxWidth`, `maxHeight`, and `imageQuality` arguments are not currently + // supported. If any of these arguments are supplied, they will be silently + // ignored. @override Future> getMultiImage({ double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) async { const XTypeGroup typeGroup = XTypeGroup(label: 'Images', mimeTypes: ['image/*']); diff --git a/packages/image_picker/image_picker_linux/pubspec.yaml b/packages/image_picker/image_picker_linux/pubspec.yaml index 683ad119c4b..9e0ad116044 100644 --- a/packages/image_picker/image_picker_linux/pubspec.yaml +++ b/packages/image_picker/image_picker_linux/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_linux description: Linux platform implementation of image_picker repository: https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_linux issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.2.2 +version: 0.2.1+1 environment: sdk: ^3.1.0 diff --git a/packages/image_picker/image_picker_macos/CHANGELOG.md b/packages/image_picker/image_picker_macos/CHANGELOG.md index b5c324b9528..2213848edf9 100644 --- a/packages/image_picker/image_picker_macos/CHANGELOG.md +++ b/packages/image_picker/image_picker_macos/CHANGELOG.md @@ -1,6 +1,5 @@ -## 0.2.2 +## NEXT -* Adds limit parameter `pickMultiImage` and `pickMultipleMedia` to iOS and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. ## 0.2.1+1 diff --git a/packages/image_picker/image_picker_macos/lib/image_picker_macos.dart b/packages/image_picker/image_picker_macos/lib/image_picker_macos.dart index 028fa50d16e..9e9447a5710 100644 --- a/packages/image_picker/image_picker_macos/lib/image_picker_macos.dart +++ b/packages/image_picker/image_picker_macos/lib/image_picker_macos.dart @@ -141,15 +141,14 @@ class ImagePickerMacOS extends CameraDelegatingImagePickerPlatform { throw UnimplementedError('Unknown ImageSource: $source'); } - // `maxWidth`, `maxHeight`, `imageQuality`, and `limit` arguments are not - // currently supported. If any of these arguments are supplied, they will - // be silently ignored. + // `maxWidth`, `maxHeight`, and `imageQuality` arguments are not currently + // supported. If any of these arguments are supplied, they will be silently + // ignored. @override Future> getMultiImage({ double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) async { // TODO(stuartmorgan): Add a native implementation that can use // PHPickerViewController on macOS 13+, with this as a fallback for diff --git a/packages/image_picker/image_picker_macos/pubspec.yaml b/packages/image_picker/image_picker_macos/pubspec.yaml index ea8a72a625b..70217d847be 100644 --- a/packages/image_picker/image_picker_macos/pubspec.yaml +++ b/packages/image_picker/image_picker_macos/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_macos description: macOS platform implementation of image_picker repository: https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_macos issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.2.2 +version: 0.2.1+1 environment: sdk: ^3.1.0 diff --git a/packages/image_picker/image_picker_windows/CHANGELOG.md b/packages/image_picker/image_picker_windows/CHANGELOG.md index 6db696d9282..8575f8064c3 100644 --- a/packages/image_picker/image_picker_windows/CHANGELOG.md +++ b/packages/image_picker/image_picker_windows/CHANGELOG.md @@ -1,6 +1,5 @@ -## 0.2.2 +## NEXT -* Adds limit parameter `pickMultiImage` and `pickMultipleMedia` to iOS and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. ## 0.2.1+1 diff --git a/packages/image_picker/image_picker_windows/lib/image_picker_windows.dart b/packages/image_picker/image_picker_windows/lib/image_picker_windows.dart index fd10a8fb0ea..e9e414628c9 100644 --- a/packages/image_picker/image_picker_windows/lib/image_picker_windows.dart +++ b/packages/image_picker/image_picker_windows/lib/image_picker_windows.dart @@ -168,15 +168,14 @@ class ImagePickerWindows extends CameraDelegatingImagePickerPlatform { throw UnimplementedError('Unknown ImageSource: $source'); } - // `maxWidth`, `maxHeight`, `imageQuality`, and `limit` arguments are not - // currently supported. If any of these arguments are supplied, they will - // be silently ignored. + // `maxWidth`, `maxHeight`, and `imageQuality` arguments are not currently + // supported. If any of these arguments are supplied, they will be silently + // ignored. @override Future> getMultiImage({ double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) async { const XTypeGroup typeGroup = XTypeGroup(label: 'Images', extensions: imageFormats); diff --git a/packages/image_picker/image_picker_windows/pubspec.yaml b/packages/image_picker/image_picker_windows/pubspec.yaml index 061f3533ebd..02f0f80ca3a 100644 --- a/packages/image_picker/image_picker_windows/pubspec.yaml +++ b/packages/image_picker/image_picker_windows/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_windows description: Windows platform implementation of image_picker repository: https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_windows issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.2.2 +version: 0.2.1+1 environment: sdk: ^3.1.0 From 26fd49145871e3aa7c71cd04bfc550104bb1821b Mon Sep 17 00:00:00 2001 From: pdenert Date: Thu, 29 Feb 2024 02:53:09 +0100 Subject: [PATCH 15/45] Remove limit from pickMultiImage in iOS package --- .../image_picker_ios/ios/Classes/messages.g.h | 52 +++----- .../image_picker_ios/ios/Classes/messages.g.m | 119 +++++++----------- .../lib/image_picker_ios.dart | 11 +- .../test/image_picker_ios_test.dart | 26 ---- 4 files changed, 73 insertions(+), 135 deletions(-) diff --git a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h index de9a8200b82..edf27cdbece 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h +++ b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h @@ -40,30 +40,32 @@ typedef NS_ENUM(NSUInteger, FLTSourceType) { @class FLTSourceSpecification; @interface FLTMaxSize : NSObject -+ (instancetype)makeWithWidth:(nullable NSNumber *)width height:(nullable NSNumber *)height; -@property(nonatomic, strong, nullable) NSNumber *width; -@property(nonatomic, strong, nullable) NSNumber *height; ++ (instancetype)makeWithWidth:(nullable NSNumber *)width + height:(nullable NSNumber *)height; +@property(nonatomic, strong, nullable) NSNumber * width; +@property(nonatomic, strong, nullable) NSNumber * height; @end @interface FLTMediaSelectionOptions : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; + (instancetype)makeWithMaxSize:(FLTMaxSize *)maxSize - imageQuality:(nullable NSNumber *)imageQuality - requestFullMetadata:(BOOL)requestFullMetadata - allowMultiple:(BOOL)allowMultiple - limit:(nullable NSNumber *)limit; -@property(nonatomic, strong) FLTMaxSize *maxSize; -@property(nonatomic, strong, nullable) NSNumber *imageQuality; -@property(nonatomic, assign) BOOL requestFullMetadata; -@property(nonatomic, assign) BOOL allowMultiple; -@property(nonatomic, strong, nullable) NSNumber *limit; + imageQuality:(nullable NSNumber *)imageQuality + requestFullMetadata:(BOOL )requestFullMetadata + allowMultiple:(BOOL )allowMultiple + limit:(nullable NSNumber *)limit; +@property(nonatomic, strong) FLTMaxSize * maxSize; +@property(nonatomic, strong, nullable) NSNumber * imageQuality; +@property(nonatomic, assign) BOOL requestFullMetadata; +@property(nonatomic, assign) BOOL allowMultiple; +@property(nonatomic, strong, nullable) NSNumber * limit; @end @interface FLTSourceSpecification : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithType:(FLTSourceType)type camera:(FLTSourceCamera)camera; ++ (instancetype)makeWithType:(FLTSourceType)type + camera:(FLTSourceCamera)camera; @property(nonatomic, assign) FLTSourceType type; @property(nonatomic, assign) FLTSourceCamera camera; @end @@ -72,27 +74,13 @@ typedef NS_ENUM(NSUInteger, FLTSourceType) { NSObject *FLTImagePickerApiGetCodec(void); @protocol FLTImagePickerApi -- (void)pickImageWithSource:(FLTSourceSpecification *)source - maxSize:(FLTMaxSize *)maxSize - quality:(nullable NSNumber *)imageQuality - fullMetadata:(BOOL)requestFullMetadata - completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; -- (void)pickMultiImageWithMaxSize:(FLTMaxSize *)maxSize - quality:(nullable NSNumber *)imageQuality - fullMetadata:(BOOL)requestFullMetadata - limit:(nullable NSNumber *)limit - completion:(void (^)(NSArray *_Nullable, - FlutterError *_Nullable))completion; -- (void)pickVideoWithSource:(FLTSourceSpecification *)source - maxDuration:(nullable NSNumber *)maxDurationSeconds - completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)pickImageWithSource:(FLTSourceSpecification *)source maxSize:(FLTMaxSize *)maxSize quality:(nullable NSNumber *)imageQuality fullMetadata:(BOOL)requestFullMetadata completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)pickMultiImageWithMaxSize:(FLTMaxSize *)maxSize quality:(nullable NSNumber *)imageQuality fullMetadata:(BOOL)requestFullMetadata limit:(nullable NSNumber *)limit completion:(void (^)(NSArray *_Nullable, FlutterError *_Nullable))completion; +- (void)pickVideoWithSource:(FLTSourceSpecification *)source maxDuration:(nullable NSNumber *)maxDurationSeconds completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; /// Selects images and videos and returns their paths. -- (void)pickMediaWithMediaSelectionOptions:(FLTMediaSelectionOptions *)mediaSelectionOptions - completion:(void (^)(NSArray *_Nullable, - FlutterError *_Nullable))completion; +- (void)pickMediaWithMediaSelectionOptions:(FLTMediaSelectionOptions *)mediaSelectionOptions completion:(void (^)(NSArray *_Nullable, FlutterError *_Nullable))completion; @end -extern void SetUpFLTImagePickerApi(id binaryMessenger, - NSObject *_Nullable api); +extern void SetUpFLTImagePickerApi(id binaryMessenger, NSObject *_Nullable api); NS_ASSUME_NONNULL_END diff --git a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m index a1f5794dd6a..50ba16fa61c 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m +++ b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m @@ -69,8 +69,9 @@ - (NSArray *)toList; @end @implementation FLTMaxSize -+ (instancetype)makeWithWidth:(nullable NSNumber *)width height:(nullable NSNumber *)height { - FLTMaxSize *pigeonResult = [[FLTMaxSize alloc] init]; ++ (instancetype)makeWithWidth:(nullable NSNumber *)width + height:(nullable NSNumber *)height { + FLTMaxSize* pigeonResult = [[FLTMaxSize alloc] init]; pigeonResult.width = width; pigeonResult.height = height; return pigeonResult; @@ -94,11 +95,11 @@ - (NSArray *)toList { @implementation FLTMediaSelectionOptions + (instancetype)makeWithMaxSize:(FLTMaxSize *)maxSize - imageQuality:(nullable NSNumber *)imageQuality - requestFullMetadata:(BOOL)requestFullMetadata - allowMultiple:(BOOL)allowMultiple - limit:(nullable NSNumber *)limit { - FLTMediaSelectionOptions *pigeonResult = [[FLTMediaSelectionOptions alloc] init]; + imageQuality:(nullable NSNumber *)imageQuality + requestFullMetadata:(BOOL )requestFullMetadata + allowMultiple:(BOOL )allowMultiple + limit:(nullable NSNumber *)limit { + FLTMediaSelectionOptions* pigeonResult = [[FLTMediaSelectionOptions alloc] init]; pigeonResult.maxSize = maxSize; pigeonResult.imageQuality = imageQuality; pigeonResult.requestFullMetadata = requestFullMetadata; @@ -130,8 +131,9 @@ - (NSArray *)toList { @end @implementation FLTSourceSpecification -+ (instancetype)makeWithType:(FLTSourceType)type camera:(FLTSourceCamera)camera { - FLTSourceSpecification *pigeonResult = [[FLTSourceSpecification alloc] init]; ++ (instancetype)makeWithType:(FLTSourceType)type + camera:(FLTSourceCamera)camera { + FLTSourceSpecification* pigeonResult = [[FLTSourceSpecification alloc] init]; pigeonResult.type = type; pigeonResult.camera = camera; return pigeonResult; @@ -158,11 +160,11 @@ @interface FLTImagePickerApiCodecReader : FlutterStandardReader @implementation FLTImagePickerApiCodecReader - (nullable id)readValueOfType:(UInt8)type { switch (type) { - case 128: + case 128: return [FLTMaxSize fromList:[self readValue]]; - case 129: + case 129: return [FLTMediaSelectionOptions fromList:[self readValue]]; - case 130: + case 130: return [FLTSourceSpecification fromList:[self readValue]]; default: return [super readValueOfType:type]; @@ -204,93 +206,72 @@ - (FlutterStandardReader *)readerWithData:(NSData *)data { static FlutterStandardMessageCodec *sSharedObject = nil; static dispatch_once_t sPred = 0; dispatch_once(&sPred, ^{ - FLTImagePickerApiCodecReaderWriter *readerWriter = - [[FLTImagePickerApiCodecReaderWriter alloc] init]; + FLTImagePickerApiCodecReaderWriter *readerWriter = [[FLTImagePickerApiCodecReaderWriter alloc] init]; sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; }); return sSharedObject; } -void SetUpFLTImagePickerApi(id binaryMessenger, - NSObject *api) { +void SetUpFLTImagePickerApi(id binaryMessenger, NSObject *api) { { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage" + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector - (pickImageWithSource:maxSize:quality:fullMetadata:completion:)], - @"FLTImagePickerApi api (%@) doesn't respond to " - @"@selector(pickImageWithSource:maxSize:quality:fullMetadata:completion:)", - api); + NSCAssert([api respondsToSelector:@selector(pickImageWithSource:maxSize:quality:fullMetadata:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickImageWithSource:maxSize:quality:fullMetadata:completion:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTSourceSpecification *arg_source = GetNullableObjectAtIndex(args, 0); FLTMaxSize *arg_maxSize = GetNullableObjectAtIndex(args, 1); NSNumber *arg_imageQuality = GetNullableObjectAtIndex(args, 2); BOOL arg_requestFullMetadata = [GetNullableObjectAtIndex(args, 3) boolValue]; - [api pickImageWithSource:arg_source - maxSize:arg_maxSize - quality:arg_imageQuality - fullMetadata:arg_requestFullMetadata - completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickImageWithSource:arg_source maxSize:arg_maxSize quality:arg_imageQuality fullMetadata:arg_requestFullMetadata completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage" + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector - (pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)], - @"FLTImagePickerApi api (%@) doesn't respond to " - @"@selector(pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)", - api); + NSCAssert([api respondsToSelector:@selector(pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTMaxSize *arg_maxSize = GetNullableObjectAtIndex(args, 0); NSNumber *arg_imageQuality = GetNullableObjectAtIndex(args, 1); BOOL arg_requestFullMetadata = [GetNullableObjectAtIndex(args, 2) boolValue]; NSNumber *arg_limit = GetNullableObjectAtIndex(args, 3); - [api pickMultiImageWithMaxSize:arg_maxSize - quality:arg_imageQuality - fullMetadata:arg_requestFullMetadata - limit:arg_limit - completion:^(NSArray *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickMultiImageWithMaxSize:arg_maxSize quality:arg_imageQuality fullMetadata:arg_requestFullMetadata limit:arg_limit completion:^(NSArray *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo" + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pickVideoWithSource:maxDuration:completion:)], - @"FLTImagePickerApi api (%@) doesn't respond to " - @"@selector(pickVideoWithSource:maxDuration:completion:)", - api); + NSCAssert([api respondsToSelector:@selector(pickVideoWithSource:maxDuration:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickVideoWithSource:maxDuration:completion:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTSourceSpecification *arg_source = GetNullableObjectAtIndex(args, 0); NSNumber *arg_maxDurationSeconds = GetNullableObjectAtIndex(args, 1); - [api pickVideoWithSource:arg_source - maxDuration:arg_maxDurationSeconds - completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickVideoWithSource:arg_source maxDuration:arg_maxDurationSeconds completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; @@ -298,23 +279,19 @@ void SetUpFLTImagePickerApi(id binaryMessenger, } /// Selects images and videos and returns their paths. { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia" + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pickMediaWithMediaSelectionOptions:completion:)], - @"FLTImagePickerApi api (%@) doesn't respond to " - @"@selector(pickMediaWithMediaSelectionOptions:completion:)", - api); + NSCAssert([api respondsToSelector:@selector(pickMediaWithMediaSelectionOptions:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickMediaWithMediaSelectionOptions:completion:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTMediaSelectionOptions *arg_mediaSelectionOptions = GetNullableObjectAtIndex(args, 0); - [api pickMediaWithMediaSelectionOptions:arg_mediaSelectionOptions - completion:^(NSArray *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickMediaWithMediaSelectionOptions:arg_mediaSelectionOptions completion:^(NSArray *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; diff --git a/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart b/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart index b9a8c9239f1..a9d7f5990b9 100644 --- a/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart +++ b/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart @@ -87,7 +87,6 @@ class ImagePickerIOS extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) async { final List paths = await _pickMultiImageAsPath( options: MultiImagePickerOptions( @@ -96,7 +95,6 @@ class ImagePickerIOS extends ImagePickerPlatform { maxHeight: maxHeight, imageQuality: imageQuality, ), - limit: limit, ), ); // Convert an empty list to a null return since that was the legacy behavior @@ -143,10 +141,11 @@ class ImagePickerIOS extends ImagePickerPlatform { // TODO(stuartmorgan): Remove the cast once Pigeon supports non-nullable // generics, https://github.com/flutter/flutter/issues/97848 return (await _hostApi.pickMultiImage( - MaxSize(width: maxWidth, height: maxHeight), - imageQuality, - options.imageOptions.requestFullMetadata, - limit)) + MaxSize(width: maxWidth, height: maxHeight), + imageQuality, + options.imageOptions.requestFullMetadata, + limit, + )) .cast(); } diff --git a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart index d6128d33151..8fcd33b53f0 100644 --- a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart +++ b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart @@ -364,12 +364,6 @@ void main() { maxHeight: 20.0, imageQuality: 70, ); - await picker.pickMultiImage( - maxWidth: 10.0, - maxHeight: 20.0, - imageQuality: 70, - limit: 5, - ); expect( log.calls, @@ -430,14 +424,6 @@ void main() { 'requestFullMetadata': true, 'limit': null, }), - const _LoggedMethodCall('pickMultiImage', - arguments: { - 'maxWidth': 10.0, - 'maxHeight': 20.0, - 'imageQuality': 70, - 'requestFullMetadata': true, - 'limit': 5, - }), ], ); }); @@ -466,18 +452,6 @@ void main() { ); }); - test('does not accept a invalid limit argument', () { - expect( - () => picker.pickMultiImage(limit: -1), - throwsArgumentError, - ); - - expect( - () => picker.pickMultiImage(limit: 0), - throwsArgumentError, - ); - }); - test('returns null for an empty list', () async { log.returnValue = []; From 70fce1fac607ae2daa7b7a4190039dd3e9dbca03 Mon Sep 17 00:00:00 2001 From: pdenert Date: Thu, 29 Feb 2024 03:31:35 +0100 Subject: [PATCH 16/45] Cleanup limit in image_picker_android --- .../imagepicker/ImagePickerPlugin.java | 4 ++-- .../lib/image_picker_android.dart | 20 +++++++++++++++++-- .../test/image_picker_android_test.dart | 14 ------------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index 5cac836e0fc..6e51ecf1168 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -128,7 +128,7 @@ private class ActivityState { this.messenger = messenger; delegate = constructDelegate(activity); - ImagePickerApi.setup(messenger, handler); + ImagePickerApi.setUp(messenger, handler); observer = new LifeCycleObserver(activity); if (registrar != null) { // V1 embedding setup for activity listeners. @@ -162,7 +162,7 @@ void release() { lifecycle = null; } - ImagePickerApi.setup(messenger, null); + ImagePickerApi.setUp(messenger, null); if (application != null) { application.unregisterActivityLifecycleCallbacks(observer); diff --git a/packages/image_picker/image_picker_android/lib/image_picker_android.dart b/packages/image_picker/image_picker_android/lib/image_picker_android.dart index 8e9bd05974e..8110d003471 100644 --- a/packages/image_picker/image_picker_android/lib/image_picker_android.dart +++ b/packages/image_picker/image_picker_android/lib/image_picker_android.dart @@ -50,13 +50,11 @@ class ImagePickerAndroid extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) async { final List paths = await _getMultiImagePath( maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: imageQuality, - limit: limit, ); if (paths.isEmpty) { return null; @@ -221,6 +219,24 @@ class ImagePickerAndroid extends ImagePickerPlatform { return paths.map((dynamic path) => XFile(path as String)).toList(); } + @override + Future> getMultiImageWithOptions({ + MultiImagePickerOptions options = const MultiImagePickerOptions(), + }) async { + final List paths = await _getMultiImagePath( + maxWidth: options.imageOptions.maxWidth, + maxHeight: options.imageOptions.maxHeight, + imageQuality: options.imageOptions.imageQuality, + limit: options.limit, + ); + + if (paths.isEmpty) { + return []; + } + + return paths.map((dynamic path) => XFile(path as String)).toList(); + } + @override Future> getMedia({ required MediaOptions options, diff --git a/packages/image_picker/image_picker_android/test/image_picker_android_test.dart b/packages/image_picker/image_picker_android/test/image_picker_android_test.dart index 1e1387988fe..630f9f18163 100644 --- a/packages/image_picker/image_picker_android/test/image_picker_android_test.dart +++ b/packages/image_picker/image_picker_android/test/image_picker_android_test.dart @@ -164,13 +164,11 @@ void main() { maxWidth: 10.0, maxHeight: 20.0, imageQuality: 70, - limit: 5, ); expect(api.passedImageOptions?.maxWidth, 10.0); expect(api.passedImageOptions?.maxHeight, 20.0); expect(api.passedImageOptions?.quality, 70); - expect(api.limit, 5); }); test('does not accept a negative width or height argument', () { @@ -197,18 +195,6 @@ void main() { ); }); - test('does not accept an invalid limit argument', () { - expect( - () => picker.pickMultiImage(limit: -1), - throwsArgumentError, - ); - - expect( - () => picker.pickMultiImage(limit: 0), - throwsArgumentError, - ); - }); - test('handles an empty path response gracefully', () async { api.returnValue = []; From c7c2b0279720e981fc121be9c1c4a97d66c1e68c Mon Sep 17 00:00:00 2001 From: pdenert Date: Thu, 29 Feb 2024 03:40:42 +0100 Subject: [PATCH 17/45] Change limit verification param --- .../image_picker_android/lib/image_picker_android.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/image_picker_android/lib/image_picker_android.dart b/packages/image_picker/image_picker_android/lib/image_picker_android.dart index 8110d003471..0ecde09f68a 100644 --- a/packages/image_picker/image_picker_android/lib/image_picker_android.dart +++ b/packages/image_picker/image_picker_android/lib/image_picker_android.dart @@ -82,8 +82,8 @@ class ImagePickerAndroid extends ImagePickerPlatform { throw ArgumentError.value(maxHeight, 'maxHeight', 'cannot be negative'); } - if (limit != null && limit < 1) { - throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); + if (limit != null && limit < 2) { + throw ArgumentError.value(limit, 'limit', 'cannot be lower than 2'); } return _hostApi.pickImages( From 4e7ed37b222fdc18e2b9bb6630958bd28301ebbd Mon Sep 17 00:00:00 2001 From: pdenert Date: Fri, 1 Mar 2024 10:38:19 +0100 Subject: [PATCH 18/45] Update changelog --- packages/image_picker/image_picker/CHANGELOG.md | 2 +- packages/image_picker/image_picker_android/CHANGELOG.md | 2 +- packages/image_picker/image_picker_ios/CHANGELOG.md | 2 +- 3 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 615d863a9e8..85da8e01b42 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,6 +1,6 @@ ## 1.0.8 -* Adds limit parameter to `pickMultiImage` and `pickMultipleMedia` to iOS and Android. +* Adds limit parameter to `MediaOptions` and `MultiImagePickerOptions` and supports its use on iOS and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. * Updates support matrix in README to indicate that iOS 11 is no longer supported. * Clients on versions of Flutter that still support iOS 11 can continue to use this diff --git a/packages/image_picker/image_picker_android/CHANGELOG.md b/packages/image_picker/image_picker_android/CHANGELOG.md index a5ca66b4e34..ad758fadd0f 100644 --- a/packages/image_picker/image_picker_android/CHANGELOG.md +++ b/packages/image_picker/image_picker_android/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.8.10 -* Adds limit parameter to `pickMultiImage` and `pickMultipleMedia`. +* Adds limit parameter to `MediaOptions` and `MultiImagePickerOptions` and supports its use. ## 0.8.9+6 diff --git a/packages/image_picker/image_picker_ios/CHANGELOG.md b/packages/image_picker/image_picker_ios/CHANGELOG.md index 2a00b710b1c..2744c0f183e 100644 --- a/packages/image_picker/image_picker_ios/CHANGELOG.md +++ b/packages/image_picker/image_picker_ios/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.8.10 -* Adds limit parameter `pickMultiImage` and `pickMultipleMedia`. +* Adds limit parameter to `MediaOptions` and `MultiImagePickerOptions` and supports its use. ## 0.8.9+2 From 89e6aeb50c03673adf34afc6348da1a0c2fb00b1 Mon Sep 17 00:00:00 2001 From: pdenert Date: Fri, 1 Mar 2024 10:42:43 +0100 Subject: [PATCH 19/45] Change limit validation to lower than 2 --- .../image_picker_android/lib/image_picker_android.dart | 5 ----- .../image_picker_ios/lib/image_picker_ios.dart | 8 ++++---- .../src/method_channel/method_channel_image_picker.dart | 4 ++-- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/image_picker/image_picker_android/lib/image_picker_android.dart b/packages/image_picker/image_picker_android/lib/image_picker_android.dart index 0ecde09f68a..4f55fc30dee 100644 --- a/packages/image_picker/image_picker_android/lib/image_picker_android.dart +++ b/packages/image_picker/image_picker_android/lib/image_picker_android.dart @@ -273,11 +273,6 @@ class ImagePickerAndroid extends ImagePickerPlatform { _imageOptionsToImageSelectionOptionsWithValidator( mediaOptions.imageOptions); - final int? limit = mediaOptions.limit; - if (limit != null && limit < 1) { - throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); - } - return MediaSelectionOptions( imageSelectionOptions: imageSelectionOptions, ); diff --git a/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart b/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart index a9d7f5990b9..b46c439277d 100644 --- a/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart +++ b/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart @@ -134,8 +134,8 @@ class ImagePickerIOS extends ImagePickerPlatform { } final int? limit = options.limit; - if (limit != null && limit < 1) { - throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); + if (limit != null && limit < 2) { + throw ArgumentError.value(limit, 'limit', 'cannot be lower than 2'); } // TODO(stuartmorgan): Remove the cast once Pigeon supports non-nullable @@ -219,8 +219,8 @@ class ImagePickerIOS extends ImagePickerPlatform { _imageOptionsToMaxSizeWithValidation(mediaOptions.imageOptions); final int? limit = mediaOptions.limit; - if (limit != null && limit < 1) { - throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); + if (limit != null && limit < 2) { + throw ArgumentError.value(limit, 'limit', 'cannot be lower than 2'); } return MediaSelectionOptions( 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 074696b88a2..bfdc01e3862 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 @@ -266,8 +266,8 @@ class MethodChannelImagePicker extends ImagePickerPlatform { final ImageOptions imageOptions = options.imageOptions; final int? limit = options.limit; - if (limit != null && limit < 1) { - throw ArgumentError.value(limit, 'limit', 'cannot be negative or zero'); + if (limit != null && limit < 2) { + throw ArgumentError.value(limit, 'limit', 'cannot be lower than 2'); } final Map args = { From ba2ed83acb21e2542f77c74e5a916b3a1515f750 Mon Sep 17 00:00:00 2001 From: Piotr Denert Date: Mon, 4 Mar 2024 12:43:58 -0800 Subject: [PATCH 20/45] Update ios CHANGELOG.md Co-authored-by: Victoria Ashworth <15619084+vashworth@users.noreply.github.com> --- packages/image_picker/image_picker_ios/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker_ios/CHANGELOG.md b/packages/image_picker/image_picker_ios/CHANGELOG.md index 2744c0f183e..787524c0e55 100644 --- a/packages/image_picker/image_picker_ios/CHANGELOG.md +++ b/packages/image_picker/image_picker_ios/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.8.10 -* Adds limit parameter to `MediaOptions` and `MultiImagePickerOptions` and supports its use. +* Adds limit parameter to `MediaOptions` and `MultiImagePickerOptions` that sets a limit to how many media or image items can be selected. ## 0.8.9+2 From 861438ab277a69202529f0e221fdee90b0523a05 Mon Sep 17 00:00:00 2001 From: pdenert Date: Mon, 4 Mar 2024 21:45:55 +0100 Subject: [PATCH 21/45] Update android changelog --- 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 ad758fadd0f..9efc86c1c93 100644 --- a/packages/image_picker/image_picker_android/CHANGELOG.md +++ b/packages/image_picker/image_picker_android/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.8.10 -* Adds limit parameter to `MediaOptions` and `MultiImagePickerOptions` and supports its use. +* Adds limit parameter to `MediaOptions` and `MultiImagePickerOptions` that sets a limit to how many media or image items can be selected. ## 0.8.9+6 From 920baa9208af30b692ed4e583073e8d14da7eebb Mon Sep 17 00:00:00 2001 From: pdenert Date: Mon, 4 Mar 2024 23:35:40 +0100 Subject: [PATCH 22/45] Update image_picker changelog --- packages/image_picker/image_picker/CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index 85da8e01b42..4d9e22c7bdf 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,6 +1,7 @@ ## 1.0.8 -* Adds limit parameter to `MediaOptions` and `MultiImagePickerOptions` and supports its use on iOS and Android. +* Adds limit parameter to `MediaOptions` and `MultiImagePickerOptions` that sets a limit to +* how many media or image items can be selected. Supports its use only on iOS and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. * Updates support matrix in README to indicate that iOS 11 is no longer supported. * Clients on versions of Flutter that still support iOS 11 can continue to use this From f917977de85818eab4ded3efd14ba0b8a05bc736 Mon Sep 17 00:00:00 2001 From: pdenert Date: Mon, 4 Mar 2024 23:47:36 +0100 Subject: [PATCH 23/45] Fix ImagePickerPluginTests --- .../ios/RunnerTests/ImagePickerPluginTests.m | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/image_picker/image_picker_ios/example/ios/RunnerTests/ImagePickerPluginTests.m b/packages/image_picker/image_picker_ios/example/ios/RunnerTests/ImagePickerPluginTests.m index 36ca8ec9658..4aff4da52d3 100644 --- a/packages/image_picker/image_picker_ios/example/ios/RunnerTests/ImagePickerPluginTests.m +++ b/packages/image_picker/image_picker_ios/example/ios/RunnerTests/ImagePickerPluginTests.m @@ -175,6 +175,7 @@ - (void)testPickMultiImageShouldUseUIImagePickerControllerOnPreiOS14 { [plugin pickMultiImageWithMaxSize:[FLTMaxSize makeWithWidth:@(100) height:@(200)] quality:@(50) fullMetadata:YES + limit:nil completion:^(NSArray *_Nullable result, FlutterError *_Nullable error){ }]; @@ -198,7 +199,8 @@ - (void)testPickMediaShouldUseUIImagePickerControllerOnPreiOS14 { [FLTMediaSelectionOptions makeWithMaxSize:[FLTMaxSize makeWithWidth:@(100) height:@(200)] imageQuality:@(50) requestFullMetadata:YES - allowMultiple:YES]; + allowMultiple:YES + limit:nil]; [plugin pickMediaWithMediaSelectionOptions:mediaSelectionOptions completion:^(NSArray *_Nullable result, @@ -236,6 +238,7 @@ - (void)testPickMultiImageWithoutFullMetadata { [plugin pickMultiImageWithMaxSize:[[FLTMaxSize alloc] init] quality:nil fullMetadata:NO + limit:nil completion:^(NSArray *_Nullable result, FlutterError *_Nullable error){ }]; @@ -254,7 +257,8 @@ - (void)testPickMediaWithoutFullMetadata { [FLTMediaSelectionOptions makeWithMaxSize:[FLTMaxSize makeWithWidth:@(100) height:@(200)] imageQuality:@(50) requestFullMetadata:YES - allowMultiple:YES]; + allowMultiple:YES + limit:nil]; [plugin pickMediaWithMediaSelectionOptions:mediaSelectionOptions @@ -544,6 +548,7 @@ - (void)testPickMultiImageDuplicateCallCancels API_AVAILABLE(ios(14)) { [plugin pickMultiImageWithMaxSize:[FLTMaxSize makeWithWidth:@100 height:@100] quality:nil fullMetadata:YES + limit:nil completion:^(NSArray *result, FlutterError *error) { XCTAssertNotNil(error); XCTAssertEqualObjects(error.code, @"multiple_request"); @@ -552,6 +557,7 @@ - (void)testPickMultiImageDuplicateCallCancels API_AVAILABLE(ios(14)) { [plugin pickMultiImageWithMaxSize:[FLTMaxSize makeWithWidth:@100 height:@100] quality:nil fullMetadata:YES + limit:nil completion:^(NSArray *result, FlutterError *error){ }]; [self waitForExpectationsWithTimeout:30 handler:nil]; @@ -570,7 +576,8 @@ - (void)testPickMediaDuplicateCallCancels API_AVAILABLE(ios(14)) { [FLTMediaSelectionOptions makeWithMaxSize:[FLTMaxSize makeWithWidth:@(100) height:@(200)] imageQuality:@(50) requestFullMetadata:YES - allowMultiple:YES]; + allowMultiple:YES + limit:nil]; XCTestExpectation *firstCallExpectation = [self expectationWithDescription:@"first call"]; [plugin pickMediaWithMediaSelectionOptions:options completion:^(NSArray *result, FlutterError *error) { From 90dfa0779ce51648e174c08ee40ca7b40221ba08 Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 5 Mar 2024 00:05:09 +0100 Subject: [PATCH 24/45] Add limit test to iOS --- .../ios/RunnerTests/ImagePickerPluginTests.m | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/packages/image_picker/image_picker_ios/example/ios/RunnerTests/ImagePickerPluginTests.m b/packages/image_picker/image_picker_ios/example/ios/RunnerTests/ImagePickerPluginTests.m index 4aff4da52d3..d54d5c3ec24 100644 --- a/packages/image_picker/image_picker_ios/example/ios/RunnerTests/ImagePickerPluginTests.m +++ b/packages/image_picker/image_picker_ios/example/ios/RunnerTests/ImagePickerPluginTests.m @@ -615,4 +615,79 @@ - (void)testPickVideoDuplicateCallCancels API_AVAILABLE(ios(14)) { [self waitForExpectationsWithTimeout:30 handler:nil]; } +- (void)testPickMultiImageWithLimit { + FLTImagePickerPlugin *plugin = [[FLTImagePickerPlugin alloc] init]; + [plugin pickMultiImageWithMaxSize:[[FLTMaxSize alloc] init] + quality:nil + fullMetadata:NO + limit:@(2) + completion:^(NSArray *_Nullable result, + FlutterError *_Nullable error){ + }]; + XCTAssertEqual(plugin.callContext.maxImageCount, 2); +} + +- (void)testPickMediaWithLimitAllowsMultiple { + FLTImagePickerPlugin *plugin = [[FLTImagePickerPlugin alloc] init]; + FLTMediaSelectionOptions *mediaSelectionOptions = + [FLTMediaSelectionOptions makeWithMaxSize:[FLTMaxSize makeWithWidth:@(100) height:@(200)] + imageQuality:nil + requestFullMetadata:NO + allowMultiple:YES + limit:@(2)]; + + [plugin pickMediaWithMediaSelectionOptions:mediaSelectionOptions + completion:^(NSArray *_Nullable result, + FlutterError *_Nullable error){ + }]; + + XCTAssertEqual(plugin.callContext.maxImageCount, 2); +} + +- (void)testPickMediaWithLimitMultipleNotAllowed { + FLTImagePickerPlugin *plugin = [[FLTImagePickerPlugin alloc] init]; + FLTMediaSelectionOptions *mediaSelectionOptions = + [FLTMediaSelectionOptions makeWithMaxSize:[FLTMaxSize makeWithWidth:@(100) height:@(200)] + imageQuality:nil + requestFullMetadata:NO + allowMultiple:NO + limit:@(2)]; + + [plugin pickMediaWithMediaSelectionOptions:mediaSelectionOptions + completion:^(NSArray *_Nullable result, + FlutterError *_Nullable error){ + }]; + + XCTAssertEqual(plugin.callContext.maxImageCount, 1); +} + +- (void)testPickMultiImageWithoutLimit { + FLTImagePickerPlugin *plugin = [[FLTImagePickerPlugin alloc] init]; + [plugin pickMultiImageWithMaxSize:[[FLTMaxSize alloc] init] + quality:nil + fullMetadata:NO + limit:nil + completion:^(NSArray *_Nullable result, + FlutterError *_Nullable error){ + }]; + XCTAssertEqual(plugin.callContext.maxImageCount, 0); +} + +- (void)testPickMediaWithoutLimitAllowsMultiple { + FLTImagePickerPlugin *plugin = [[FLTImagePickerPlugin alloc] init]; + FLTMediaSelectionOptions *mediaSelectionOptions = + [FLTMediaSelectionOptions makeWithMaxSize:[FLTMaxSize makeWithWidth:@(100) height:@(200)] + imageQuality:nil + requestFullMetadata:NO + allowMultiple:YES + limit:nil]; + + [plugin pickMediaWithMediaSelectionOptions:mediaSelectionOptions + completion:^(NSArray *_Nullable result, + FlutterError *_Nullable error){ + }]; + + XCTAssertEqual(plugin.callContext.maxImageCount, 0); +} + @end From b6308c28a3d39c7667a7ae39127567df14f11b64 Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 5 Mar 2024 00:09:41 +0100 Subject: [PATCH 25/45] Remove dependency overrides from untouched packages --- .../image_picker/image_picker_for_web/example/pubspec.yaml | 5 ----- packages/image_picker/image_picker_for_web/pubspec.yaml | 5 ----- .../image_picker/image_picker_linux/example/pubspec.yaml | 5 ----- packages/image_picker/image_picker_linux/pubspec.yaml | 5 ----- .../image_picker/image_picker_macos/example/pubspec.yaml | 5 ----- packages/image_picker/image_picker_macos/pubspec.yaml | 5 ----- .../image_picker/image_picker_windows/example/pubspec.yaml | 5 ----- packages/image_picker/image_picker_windows/pubspec.yaml | 5 ----- 8 files changed, 40 deletions(-) diff --git a/packages/image_picker/image_picker_for_web/example/pubspec.yaml b/packages/image_picker/image_picker_for_web/example/pubspec.yaml index 8146fac14c3..f4f85645c58 100644 --- a/packages/image_picker/image_picker_for_web/example/pubspec.yaml +++ b/packages/image_picker/image_picker_for_web/example/pubspec.yaml @@ -18,8 +18,3 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_for_web: {path: ../../../image_picker/image_picker_for_web}, image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_for_web/pubspec.yaml b/packages/image_picker/image_picker_for_web/pubspec.yaml index 7eab0bc2ec2..85567a58209 100644 --- a/packages/image_picker/image_picker_for_web/pubspec.yaml +++ b/packages/image_picker/image_picker_for_web/pubspec.yaml @@ -34,8 +34,3 @@ topics: - image-picker - files - file-selection - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_linux/example/pubspec.yaml b/packages/image_picker/image_picker_linux/example/pubspec.yaml index ac97ca436c2..a49e487d243 100644 --- a/packages/image_picker/image_picker_linux/example/pubspec.yaml +++ b/packages/image_picker/image_picker_linux/example/pubspec.yaml @@ -27,8 +27,3 @@ dev_dependencies: flutter: uses-material-design: true - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_linux: {path: ../../../image_picker/image_picker_linux}, image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_linux/pubspec.yaml b/packages/image_picker/image_picker_linux/pubspec.yaml index 9e0ad116044..5be7f927eec 100644 --- a/packages/image_picker/image_picker_linux/pubspec.yaml +++ b/packages/image_picker/image_picker_linux/pubspec.yaml @@ -32,8 +32,3 @@ topics: - image-picker - files - file-selection - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_macos/example/pubspec.yaml b/packages/image_picker/image_picker_macos/example/pubspec.yaml index d0c84499a22..cff5501cfa2 100644 --- a/packages/image_picker/image_picker_macos/example/pubspec.yaml +++ b/packages/image_picker/image_picker_macos/example/pubspec.yaml @@ -27,8 +27,3 @@ dev_dependencies: flutter: uses-material-design: true - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_macos: {path: ../../../image_picker/image_picker_macos}, image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_macos/pubspec.yaml b/packages/image_picker/image_picker_macos/pubspec.yaml index 70217d847be..5fc9563c02b 100644 --- a/packages/image_picker/image_picker_macos/pubspec.yaml +++ b/packages/image_picker/image_picker_macos/pubspec.yaml @@ -32,8 +32,3 @@ topics: - image-picker - files - file-selection - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_windows/example/pubspec.yaml b/packages/image_picker/image_picker_windows/example/pubspec.yaml index 07b51d19175..983f9520e36 100644 --- a/packages/image_picker/image_picker_windows/example/pubspec.yaml +++ b/packages/image_picker/image_picker_windows/example/pubspec.yaml @@ -27,8 +27,3 @@ dev_dependencies: flutter: uses-material-design: true - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}, image_picker_windows: {path: ../../../image_picker/image_picker_windows}} diff --git a/packages/image_picker/image_picker_windows/pubspec.yaml b/packages/image_picker/image_picker_windows/pubspec.yaml index 02f0f80ca3a..23e4777888f 100644 --- a/packages/image_picker/image_picker_windows/pubspec.yaml +++ b/packages/image_picker/image_picker_windows/pubspec.yaml @@ -32,8 +32,3 @@ topics: - image-picker - files - file-selection - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}} From b792137f063d5a4a04dcbdcb0746a21eeebb7082 Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 5 Mar 2024 09:32:05 +0100 Subject: [PATCH 26/45] Format packages --- .../imagepicker/ImagePickerDelegate.java | 12 +- .../imagepicker/ImagePickerPlugin.java | 12 +- .../flutter/plugins/imagepicker/Messages.java | 100 ++++++++----- .../image_picker_ios/ios/Classes/messages.g.h | 52 ++++--- .../image_picker_ios/ios/Classes/messages.g.m | 119 +++++++++------- .../image_picker_ios/lib/src/messages.g.dart | 66 +++++---- .../image_picker_ios/test/test_api.g.dart | 131 +++++++++++------- 7 files changed, 306 insertions(+), 186 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index 7df56919dcc..f3fea9e2a40 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -6,8 +6,6 @@ import android.Manifest; import android.app.Activity; -import android.os.Bundle; -import android.os.ext.SdkExtensions; import android.content.ActivityNotFoundException; import android.content.ClipData; import android.content.Intent; @@ -17,6 +15,7 @@ import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Build; +import android.os.ext.SdkExtensions; import android.provider.MediaStore; import androidx.activity.result.PickVisualMediaRequest; import androidx.activity.result.contract.ActivityResultContracts; @@ -303,11 +302,12 @@ private void launchPickMediaFromGalleryIntent(Messages.GeneralOptions generalOpt int effectiveLimit; if (limit != null) { - effectiveLimit = Math.toIntExact(limit); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { - effectiveLimit = MediaStore.getPickImagesMaxLimit(); + effectiveLimit = Math.toIntExact(limit); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R + && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { + effectiveLimit = MediaStore.getPickImagesMaxLimit(); } else { - effectiveLimit = Integer.MAX_VALUE; + effectiveLimit = Integer.MAX_VALUE; } pickMediaIntent = diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index 6e51ecf1168..fe8cfd9ed48 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -324,14 +324,16 @@ public void pickImages( int effectiveLimit; if (limit != null) { - effectiveLimit = Math.toIntExact(limit); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { - effectiveLimit = MediaStore.getPickImagesMaxLimit(); + effectiveLimit = Math.toIntExact(limit); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R + && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { + effectiveLimit = MediaStore.getPickImagesMaxLimit(); } else { - effectiveLimit = Integer.MAX_VALUE; + effectiveLimit = Integer.MAX_VALUE; } - delegate.chooseMultiImageFromGallery(options, generalOptions.getUsePhotoPicker(), effectiveLimit, result); + delegate.chooseMultiImageFromGallery( + options, generalOptions.getUsePhotoPicker(), effectiveLimit, result); } else { switch (source.getType()) { case GALLERY: diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/Messages.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/Messages.java index 9ef8f20ce2a..b987a2284a8 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/Messages.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/Messages.java @@ -21,11 +21,7 @@ import java.lang.annotation.Target; import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** Generated class from Pigeon. */ @SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) @@ -40,8 +36,7 @@ public static class FlutterError extends RuntimeException { /** The error details. Must be a datatype supported by the api codec. */ public final Object details; - public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) - { + public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) { super(message); this.code = code; this.details = details; @@ -60,7 +55,7 @@ protected static ArrayList wrapError(@NonNull Throwable exception) { errorList.add(exception.toString()); errorList.add(exception.getClass().getSimpleName()); errorList.add( - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); } return errorList; } @@ -194,7 +189,8 @@ ArrayList toList() { Object usePhotoPicker = list.get(1); pigeonResult.setUsePhotoPicker((Boolean) usePhotoPicker); Object limit = list.get(2); - pigeonResult.setLimit((limit == null) ? null : ((limit instanceof Integer) ? (Integer) limit : (Long) limit)); + pigeonResult.setLimit( + (limit == null) ? null : ((limit instanceof Integer) ? (Integer) limit : (Long) limit)); return pigeonResult; } } @@ -202,7 +198,7 @@ ArrayList toList() { /** * Options for image selection and output. * - * Generated class from Pigeon that represents data sent in messages. + *

Generated class from Pigeon that represents data sent in messages. */ public static final class ImageSelectionOptions { /** If set, the max width that the image should be resized to fit in. */ @@ -230,7 +226,7 @@ public void setMaxHeight(@Nullable Double setterArg) { /** * The quality of the output image, from 0-100. * - * 100 indicates original quality. + *

100 indicates original quality. */ private @NonNull Long quality; @@ -299,7 +295,10 @@ ArrayList toList() { Object maxHeight = list.get(1); pigeonResult.setMaxHeight((Double) maxHeight); Object quality = list.get(2); - pigeonResult.setQuality((quality == null) ? null : ((quality instanceof Integer) ? (Integer) quality : (Long) quality)); + pigeonResult.setQuality( + (quality == null) + ? null + : ((quality instanceof Integer) ? (Integer) quality : (Long) quality)); return pigeonResult; } } @@ -349,7 +348,10 @@ ArrayList toList() { static @NonNull MediaSelectionOptions fromList(@NonNull ArrayList list) { MediaSelectionOptions pigeonResult = new MediaSelectionOptions(); Object imageSelectionOptions = list.get(0); - pigeonResult.setImageSelectionOptions((imageSelectionOptions == null) ? null : ImageSelectionOptions.fromList((ArrayList) imageSelectionOptions)); + pigeonResult.setImageSelectionOptions( + (imageSelectionOptions == null) + ? null + : ImageSelectionOptions.fromList((ArrayList) imageSelectionOptions)); return pigeonResult; } } @@ -357,7 +359,7 @@ ArrayList toList() { /** * Options for image selection and output. * - * Generated class from Pigeon that represents data sent in messages. + *

Generated class from Pigeon that represents data sent in messages. */ public static final class VideoSelectionOptions { /** The maximum desired length for the video, in seconds. */ @@ -398,7 +400,12 @@ ArrayList toList() { static @NonNull VideoSelectionOptions fromList(@NonNull ArrayList list) { VideoSelectionOptions pigeonResult = new VideoSelectionOptions(); Object maxDurationSeconds = list.get(0); - pigeonResult.setMaxDurationSeconds((maxDurationSeconds == null) ? null : ((maxDurationSeconds instanceof Integer) ? (Integer) maxDurationSeconds : (Long) maxDurationSeconds)); + pigeonResult.setMaxDurationSeconds( + (maxDurationSeconds == null) + ? null + : ((maxDurationSeconds instanceof Integer) + ? (Integer) maxDurationSeconds + : (Long) maxDurationSeconds)); return pigeonResult; } } @@ -406,7 +413,7 @@ ArrayList toList() { /** * Specification for the source of an image or video selection. * - * Generated class from Pigeon that represents data sent in messages. + *

Generated class from Pigeon that represents data sent in messages. */ public static final class SourceSpecification { private @NonNull SourceType type; @@ -482,9 +489,9 @@ ArrayList toList() { /** * An error that occurred during lost result retrieval. * - * The data here maps to the `PlatformException` that will be created from it. + *

The data here maps to the `PlatformException` that will be created from it. * - * Generated class from Pigeon that represents data sent in messages. + *

Generated class from Pigeon that represents data sent in messages. */ public static final class CacheRetrievalError { private @NonNull String code; @@ -560,7 +567,7 @@ ArrayList toList() { /** * The result of retrieving cached results from a previous run. * - * Generated class from Pigeon that represents data sent in messages. + *

Generated class from Pigeon that represents data sent in messages. */ public static final class CacheRetrievalResult { /** The type of the retrieved data. */ @@ -591,7 +598,7 @@ public void setError(@Nullable CacheRetrievalError setterArg) { /** * The results from the last selection, if any. * - * Elements must not be null, by convention. See + *

Elements must not be null, by convention. See * https://github.com/flutter/flutter/issues/97848 */ private @NonNull List paths; @@ -659,7 +666,8 @@ ArrayList toList() { Object type = list.get(0); pigeonResult.setType(CacheRetrievalType.values()[(int) type]); Object error = list.get(1); - pigeonResult.setError((error == null) ? null : CacheRetrievalError.fromList((ArrayList) error)); + pigeonResult.setError( + (error == null) ? null : CacheRetrievalError.fromList((ArrayList) error)); Object paths = list.get(2); pigeonResult.setPaths((List) paths); return pigeonResult; @@ -752,39 +760,53 @@ public interface ImagePickerApi { /** * Selects images and returns their paths. * - * Elements must not be null, by convention. See + *

Elements must not be null, by convention. See * https://github.com/flutter/flutter/issues/97848 */ - void pickImages(@NonNull SourceSpecification source, @NonNull ImageSelectionOptions options, @NonNull GeneralOptions generalOptions, @NonNull Result> result); + void pickImages( + @NonNull SourceSpecification source, + @NonNull ImageSelectionOptions options, + @NonNull GeneralOptions generalOptions, + @NonNull Result> result); /** * Selects video and returns their paths. * - * Elements must not be null, by convention. See + *

Elements must not be null, by convention. See * https://github.com/flutter/flutter/issues/97848 */ - void pickVideos(@NonNull SourceSpecification source, @NonNull VideoSelectionOptions options, @NonNull GeneralOptions generalOptions, @NonNull Result> result); + void pickVideos( + @NonNull SourceSpecification source, + @NonNull VideoSelectionOptions options, + @NonNull GeneralOptions generalOptions, + @NonNull Result> result); /** * Selects images and videos and returns their paths. * - * Elements must not be null, by convention. See + *

Elements must not be null, by convention. See * https://github.com/flutter/flutter/issues/97848 */ - void pickMedia(@NonNull MediaSelectionOptions mediaSelectionOptions, @NonNull GeneralOptions generalOptions, @NonNull Result> result); + void pickMedia( + @NonNull MediaSelectionOptions mediaSelectionOptions, + @NonNull GeneralOptions generalOptions, + @NonNull Result> result); /** Returns results from a previous app session, if any. */ - @Nullable + @Nullable CacheRetrievalResult retrieveLostResults(); /** The codec used by ImagePickerApi. */ static @NonNull MessageCodec getCodec() { return ImagePickerApiCodec.INSTANCE; } - /**Sets up an instance of `ImagePickerApi` to handle messages through the `binaryMessenger`. */ + /** Sets up an instance of `ImagePickerApi` to handle messages through the `binaryMessenger`. */ static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable ImagePickerApi api) { { BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickImages", getCodec(), taskQueue); + binaryMessenger, + "dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickImages", + getCodec(), + taskQueue); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -816,7 +838,10 @@ public void error(Throwable error) { BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickVideos", getCodec(), taskQueue); + binaryMessenger, + "dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickVideos", + getCodec(), + taskQueue); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -847,13 +872,16 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickMedia", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.image_picker_android.ImagePickerApi.pickMedia", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); ArrayList args = (ArrayList) message; - MediaSelectionOptions mediaSelectionOptionsArg = (MediaSelectionOptions) args.get(0); + MediaSelectionOptions mediaSelectionOptionsArg = + (MediaSelectionOptions) args.get(0); GeneralOptions generalOptionsArg = (GeneralOptions) args.get(1); Result> resultCallback = new Result>() { @@ -878,7 +906,10 @@ public void error(Throwable error) { BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.image_picker_android.ImagePickerApi.retrieveLostResults", getCodec(), taskQueue); + binaryMessenger, + "dev.flutter.pigeon.image_picker_android.ImagePickerApi.retrieveLostResults", + getCodec(), + taskQueue); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -886,8 +917,7 @@ public void error(Throwable error) { try { CacheRetrievalResult output = api.retrieveLostResults(); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } diff --git a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h index edf27cdbece..de9a8200b82 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h +++ b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h @@ -40,32 +40,30 @@ typedef NS_ENUM(NSUInteger, FLTSourceType) { @class FLTSourceSpecification; @interface FLTMaxSize : NSObject -+ (instancetype)makeWithWidth:(nullable NSNumber *)width - height:(nullable NSNumber *)height; -@property(nonatomic, strong, nullable) NSNumber * width; -@property(nonatomic, strong, nullable) NSNumber * height; ++ (instancetype)makeWithWidth:(nullable NSNumber *)width height:(nullable NSNumber *)height; +@property(nonatomic, strong, nullable) NSNumber *width; +@property(nonatomic, strong, nullable) NSNumber *height; @end @interface FLTMediaSelectionOptions : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; + (instancetype)makeWithMaxSize:(FLTMaxSize *)maxSize - imageQuality:(nullable NSNumber *)imageQuality - requestFullMetadata:(BOOL )requestFullMetadata - allowMultiple:(BOOL )allowMultiple - limit:(nullable NSNumber *)limit; -@property(nonatomic, strong) FLTMaxSize * maxSize; -@property(nonatomic, strong, nullable) NSNumber * imageQuality; -@property(nonatomic, assign) BOOL requestFullMetadata; -@property(nonatomic, assign) BOOL allowMultiple; -@property(nonatomic, strong, nullable) NSNumber * limit; + imageQuality:(nullable NSNumber *)imageQuality + requestFullMetadata:(BOOL)requestFullMetadata + allowMultiple:(BOOL)allowMultiple + limit:(nullable NSNumber *)limit; +@property(nonatomic, strong) FLTMaxSize *maxSize; +@property(nonatomic, strong, nullable) NSNumber *imageQuality; +@property(nonatomic, assign) BOOL requestFullMetadata; +@property(nonatomic, assign) BOOL allowMultiple; +@property(nonatomic, strong, nullable) NSNumber *limit; @end @interface FLTSourceSpecification : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithType:(FLTSourceType)type - camera:(FLTSourceCamera)camera; ++ (instancetype)makeWithType:(FLTSourceType)type camera:(FLTSourceCamera)camera; @property(nonatomic, assign) FLTSourceType type; @property(nonatomic, assign) FLTSourceCamera camera; @end @@ -74,13 +72,27 @@ typedef NS_ENUM(NSUInteger, FLTSourceType) { NSObject *FLTImagePickerApiGetCodec(void); @protocol FLTImagePickerApi -- (void)pickImageWithSource:(FLTSourceSpecification *)source maxSize:(FLTMaxSize *)maxSize quality:(nullable NSNumber *)imageQuality fullMetadata:(BOOL)requestFullMetadata completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; -- (void)pickMultiImageWithMaxSize:(FLTMaxSize *)maxSize quality:(nullable NSNumber *)imageQuality fullMetadata:(BOOL)requestFullMetadata limit:(nullable NSNumber *)limit completion:(void (^)(NSArray *_Nullable, FlutterError *_Nullable))completion; -- (void)pickVideoWithSource:(FLTSourceSpecification *)source maxDuration:(nullable NSNumber *)maxDurationSeconds completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)pickImageWithSource:(FLTSourceSpecification *)source + maxSize:(FLTMaxSize *)maxSize + quality:(nullable NSNumber *)imageQuality + fullMetadata:(BOOL)requestFullMetadata + completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)pickMultiImageWithMaxSize:(FLTMaxSize *)maxSize + quality:(nullable NSNumber *)imageQuality + fullMetadata:(BOOL)requestFullMetadata + limit:(nullable NSNumber *)limit + completion:(void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion; +- (void)pickVideoWithSource:(FLTSourceSpecification *)source + maxDuration:(nullable NSNumber *)maxDurationSeconds + completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; /// Selects images and videos and returns their paths. -- (void)pickMediaWithMediaSelectionOptions:(FLTMediaSelectionOptions *)mediaSelectionOptions completion:(void (^)(NSArray *_Nullable, FlutterError *_Nullable))completion; +- (void)pickMediaWithMediaSelectionOptions:(FLTMediaSelectionOptions *)mediaSelectionOptions + completion:(void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion; @end -extern void SetUpFLTImagePickerApi(id binaryMessenger, NSObject *_Nullable api); +extern void SetUpFLTImagePickerApi(id binaryMessenger, + NSObject *_Nullable api); NS_ASSUME_NONNULL_END diff --git a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m index 50ba16fa61c..a1f5794dd6a 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m +++ b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m @@ -69,9 +69,8 @@ - (NSArray *)toList; @end @implementation FLTMaxSize -+ (instancetype)makeWithWidth:(nullable NSNumber *)width - height:(nullable NSNumber *)height { - FLTMaxSize* pigeonResult = [[FLTMaxSize alloc] init]; ++ (instancetype)makeWithWidth:(nullable NSNumber *)width height:(nullable NSNumber *)height { + FLTMaxSize *pigeonResult = [[FLTMaxSize alloc] init]; pigeonResult.width = width; pigeonResult.height = height; return pigeonResult; @@ -95,11 +94,11 @@ - (NSArray *)toList { @implementation FLTMediaSelectionOptions + (instancetype)makeWithMaxSize:(FLTMaxSize *)maxSize - imageQuality:(nullable NSNumber *)imageQuality - requestFullMetadata:(BOOL )requestFullMetadata - allowMultiple:(BOOL )allowMultiple - limit:(nullable NSNumber *)limit { - FLTMediaSelectionOptions* pigeonResult = [[FLTMediaSelectionOptions alloc] init]; + imageQuality:(nullable NSNumber *)imageQuality + requestFullMetadata:(BOOL)requestFullMetadata + allowMultiple:(BOOL)allowMultiple + limit:(nullable NSNumber *)limit { + FLTMediaSelectionOptions *pigeonResult = [[FLTMediaSelectionOptions alloc] init]; pigeonResult.maxSize = maxSize; pigeonResult.imageQuality = imageQuality; pigeonResult.requestFullMetadata = requestFullMetadata; @@ -131,9 +130,8 @@ - (NSArray *)toList { @end @implementation FLTSourceSpecification -+ (instancetype)makeWithType:(FLTSourceType)type - camera:(FLTSourceCamera)camera { - FLTSourceSpecification* pigeonResult = [[FLTSourceSpecification alloc] init]; ++ (instancetype)makeWithType:(FLTSourceType)type camera:(FLTSourceCamera)camera { + FLTSourceSpecification *pigeonResult = [[FLTSourceSpecification alloc] init]; pigeonResult.type = type; pigeonResult.camera = camera; return pigeonResult; @@ -160,11 +158,11 @@ @interface FLTImagePickerApiCodecReader : FlutterStandardReader @implementation FLTImagePickerApiCodecReader - (nullable id)readValueOfType:(UInt8)type { switch (type) { - case 128: + case 128: return [FLTMaxSize fromList:[self readValue]]; - case 129: + case 129: return [FLTMediaSelectionOptions fromList:[self readValue]]; - case 130: + case 130: return [FLTSourceSpecification fromList:[self readValue]]; default: return [super readValueOfType:type]; @@ -206,72 +204,93 @@ - (FlutterStandardReader *)readerWithData:(NSData *)data { static FlutterStandardMessageCodec *sSharedObject = nil; static dispatch_once_t sPred = 0; dispatch_once(&sPred, ^{ - FLTImagePickerApiCodecReaderWriter *readerWriter = [[FLTImagePickerApiCodecReaderWriter alloc] init]; + FLTImagePickerApiCodecReaderWriter *readerWriter = + [[FLTImagePickerApiCodecReaderWriter alloc] init]; sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; }); return sSharedObject; } -void SetUpFLTImagePickerApi(id binaryMessenger, NSObject *api) { +void SetUpFLTImagePickerApi(id binaryMessenger, + NSObject *api) { { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage" + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pickImageWithSource:maxSize:quality:fullMetadata:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickImageWithSource:maxSize:quality:fullMetadata:completion:)", api); + NSCAssert([api respondsToSelector:@selector + (pickImageWithSource:maxSize:quality:fullMetadata:completion:)], + @"FLTImagePickerApi api (%@) doesn't respond to " + @"@selector(pickImageWithSource:maxSize:quality:fullMetadata:completion:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTSourceSpecification *arg_source = GetNullableObjectAtIndex(args, 0); FLTMaxSize *arg_maxSize = GetNullableObjectAtIndex(args, 1); NSNumber *arg_imageQuality = GetNullableObjectAtIndex(args, 2); BOOL arg_requestFullMetadata = [GetNullableObjectAtIndex(args, 3) boolValue]; - [api pickImageWithSource:arg_source maxSize:arg_maxSize quality:arg_imageQuality fullMetadata:arg_requestFullMetadata completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickImageWithSource:arg_source + maxSize:arg_maxSize + quality:arg_imageQuality + fullMetadata:arg_requestFullMetadata + completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage" + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)", api); + NSCAssert([api respondsToSelector:@selector + (pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)], + @"FLTImagePickerApi api (%@) doesn't respond to " + @"@selector(pickMultiImageWithMaxSize:quality:fullMetadata:limit:completion:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTMaxSize *arg_maxSize = GetNullableObjectAtIndex(args, 0); NSNumber *arg_imageQuality = GetNullableObjectAtIndex(args, 1); BOOL arg_requestFullMetadata = [GetNullableObjectAtIndex(args, 2) boolValue]; NSNumber *arg_limit = GetNullableObjectAtIndex(args, 3); - [api pickMultiImageWithMaxSize:arg_maxSize quality:arg_imageQuality fullMetadata:arg_requestFullMetadata limit:arg_limit completion:^(NSArray *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickMultiImageWithMaxSize:arg_maxSize + quality:arg_imageQuality + fullMetadata:arg_requestFullMetadata + limit:arg_limit + completion:^(NSArray *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo" + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pickVideoWithSource:maxDuration:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickVideoWithSource:maxDuration:completion:)", api); + NSCAssert([api respondsToSelector:@selector(pickVideoWithSource:maxDuration:completion:)], + @"FLTImagePickerApi api (%@) doesn't respond to " + @"@selector(pickVideoWithSource:maxDuration:completion:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTSourceSpecification *arg_source = GetNullableObjectAtIndex(args, 0); NSNumber *arg_maxDurationSeconds = GetNullableObjectAtIndex(args, 1); - [api pickVideoWithSource:arg_source maxDuration:arg_maxDurationSeconds completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickVideoWithSource:arg_source + maxDuration:arg_maxDurationSeconds + completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; @@ -279,19 +298,23 @@ void SetUpFLTImagePickerApi(id binaryMessenger, NSObject } /// Selects images and videos and returns their paths. { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia" + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia" binaryMessenger:binaryMessenger - codec:FLTImagePickerApiGetCodec()]; + codec:FLTImagePickerApiGetCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pickMediaWithMediaSelectionOptions:completion:)], @"FLTImagePickerApi api (%@) doesn't respond to @selector(pickMediaWithMediaSelectionOptions:completion:)", api); + NSCAssert([api respondsToSelector:@selector(pickMediaWithMediaSelectionOptions:completion:)], + @"FLTImagePickerApi api (%@) doesn't respond to " + @"@selector(pickMediaWithMediaSelectionOptions:completion:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FLTMediaSelectionOptions *arg_mediaSelectionOptions = GetNullableObjectAtIndex(args, 0); - [api pickMediaWithMediaSelectionOptions:arg_mediaSelectionOptions completion:^(NSArray *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; + [api pickMediaWithMediaSelectionOptions:arg_mediaSelectionOptions + completion:^(NSArray *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; }]; } else { [channel setMessageHandler:nil]; diff --git a/packages/image_picker/image_picker_ios/lib/src/messages.g.dart b/packages/image_picker/image_picker_ios/lib/src/messages.g.dart index 07f8face4ff..b3e785a09df 100644 --- a/packages/image_picker/image_picker_ios/lib/src/messages.g.dart +++ b/packages/image_picker/image_picker_ios/lib/src/messages.g.dart @@ -18,7 +18,8 @@ PlatformException _createConnectionError(String channelName) { ); } -List wrapResponse({Object? result, PlatformException? error, bool empty = false}) { +List wrapResponse( + {Object? result, PlatformException? error, bool empty = false}) { if (empty) { return []; } @@ -152,11 +153,11 @@ class _ImagePickerApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return MaxSize.decode(readValue(buffer)!); - case 129: + case 129: return MediaSelectionOptions.decode(readValue(buffer)!); - case 130: + case 130: return SourceSpecification.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -172,17 +173,22 @@ class ImagePickerApi { : __pigeon_binaryMessenger = binaryMessenger; final BinaryMessenger? __pigeon_binaryMessenger; - static const MessageCodec pigeonChannelCodec = _ImagePickerApiCodec(); + static const MessageCodec pigeonChannelCodec = + _ImagePickerApiCodec(); - Future pickImage(SourceSpecification source, MaxSize maxSize, int? imageQuality, bool requestFullMetadata) async { - const String __pigeon_channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage'; - final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + Future pickImage(SourceSpecification source, MaxSize maxSize, + int? imageQuality, bool requestFullMetadata) async { + const String __pigeon_channelName = + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage'; + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( __pigeon_channelName, pigeonChannelCodec, binaryMessenger: __pigeon_binaryMessenger, ); - final List? __pigeon_replyList = - await __pigeon_channel.send([source, maxSize, imageQuality, requestFullMetadata]) as List?; + final List? __pigeon_replyList = await __pigeon_channel + .send([source, maxSize, imageQuality, requestFullMetadata]) + as List?; if (__pigeon_replyList == null) { throw _createConnectionError(__pigeon_channelName); } else if (__pigeon_replyList.length > 1) { @@ -196,15 +202,19 @@ class ImagePickerApi { } } - Future> pickMultiImage(MaxSize maxSize, int? imageQuality, bool requestFullMetadata, int? limit) async { - const String __pigeon_channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage'; - final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + Future> pickMultiImage(MaxSize maxSize, int? imageQuality, + bool requestFullMetadata, int? limit) async { + const String __pigeon_channelName = + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage'; + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( __pigeon_channelName, pigeonChannelCodec, binaryMessenger: __pigeon_binaryMessenger, ); - final List? __pigeon_replyList = - await __pigeon_channel.send([maxSize, imageQuality, requestFullMetadata, limit]) as List?; + final List? __pigeon_replyList = await __pigeon_channel + .send([maxSize, imageQuality, requestFullMetadata, limit]) + as List?; if (__pigeon_replyList == null) { throw _createConnectionError(__pigeon_channelName); } else if (__pigeon_replyList.length > 1) { @@ -223,15 +233,18 @@ class ImagePickerApi { } } - Future pickVideo(SourceSpecification source, int? maxDurationSeconds) async { - const String __pigeon_channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo'; - final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + Future pickVideo( + SourceSpecification source, int? maxDurationSeconds) async { + const String __pigeon_channelName = + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo'; + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( __pigeon_channelName, pigeonChannelCodec, binaryMessenger: __pigeon_binaryMessenger, ); - final List? __pigeon_replyList = - await __pigeon_channel.send([source, maxDurationSeconds]) as List?; + final List? __pigeon_replyList = await __pigeon_channel + .send([source, maxDurationSeconds]) as List?; if (__pigeon_replyList == null) { throw _createConnectionError(__pigeon_channelName); } else if (__pigeon_replyList.length > 1) { @@ -246,15 +259,18 @@ class ImagePickerApi { } /// Selects images and videos and returns their paths. - Future> pickMedia(MediaSelectionOptions mediaSelectionOptions) async { - const String __pigeon_channelName = 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia'; - final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + Future> pickMedia( + MediaSelectionOptions mediaSelectionOptions) async { + const String __pigeon_channelName = + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia'; + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( __pigeon_channelName, pigeonChannelCodec, binaryMessenger: __pigeon_binaryMessenger, ); - final List? __pigeon_replyList = - await __pigeon_channel.send([mediaSelectionOptions]) as List?; + final List? __pigeon_replyList = await __pigeon_channel + .send([mediaSelectionOptions]) as List?; if (__pigeon_replyList == null) { throw _createConnectionError(__pigeon_channelName); } else if (__pigeon_replyList.length > 1) { diff --git a/packages/image_picker/image_picker_ios/test/test_api.g.dart b/packages/image_picker/image_picker_ios/test/test_api.g.dart index aecc90f1078..4208c68e32f 100644 --- a/packages/image_picker/image_picker_ios/test/test_api.g.dart +++ b/packages/image_picker/image_picker_ios/test/test_api.g.dart @@ -34,11 +34,11 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return MaxSize.decode(readValue(buffer)!); - case 129: + case 129: return MediaSelectionOptions.decode(readValue(buffer)!); - case 130: + case 130: return SourceSpecification.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -47,31 +47,43 @@ class _TestHostImagePickerApiCodec extends StandardMessageCodec { } abstract class TestHostImagePickerApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; - static const MessageCodec pigeonChannelCodec = _TestHostImagePickerApiCodec(); + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; + static const MessageCodec pigeonChannelCodec = + _TestHostImagePickerApiCodec(); - Future pickImage(SourceSpecification source, MaxSize maxSize, int? imageQuality, bool requestFullMetadata); + Future pickImage(SourceSpecification source, MaxSize maxSize, + int? imageQuality, bool requestFullMetadata); - Future> pickMultiImage(MaxSize maxSize, int? imageQuality, bool requestFullMetadata, int? limit); + Future> pickMultiImage( + MaxSize maxSize, int? imageQuality, bool requestFullMetadata, int? limit); - Future pickVideo(SourceSpecification source, int? maxDurationSeconds); + Future pickVideo( + SourceSpecification source, int? maxDurationSeconds); /// Selects images and videos and returns their paths. Future> pickMedia(MediaSelectionOptions mediaSelectionOptions); - static void setup(TestHostImagePickerApi? api, {BinaryMessenger? binaryMessenger}) { + static void setup(TestHostImagePickerApi? api, + {BinaryMessenger? binaryMessenger}) { { - final BasicMessageChannel __pigeon_channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage', + pigeonChannelCodec, + binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(__pigeon_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(__pigeon_channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null.'); final List args = (message as List?)!; - final SourceSpecification? arg_source = (args[0] as SourceSpecification?); + final SourceSpecification? arg_source = + (args[0] as SourceSpecification?); assert(arg_source != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null, expected non-null SourceSpecification.'); final MaxSize? arg_maxSize = (args[1] as MaxSize?); @@ -82,26 +94,33 @@ abstract class TestHostImagePickerApi { assert(arg_requestFullMetadata != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickImage was null, expected non-null bool.'); try { - final String? output = await api.pickImage(arg_source!, arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!); + final String? output = await api.pickImage(arg_source!, + arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel __pigeon_channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage', pigeonChannelCodec, + final BasicMessageChannel __pigeon_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(__pigeon_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(__pigeon_channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage was null.'); final List args = (message as List?)!; final MaxSize? arg_maxSize = (args[0] as MaxSize?); assert(arg_maxSize != null, @@ -112,63 +131,81 @@ abstract class TestHostImagePickerApi { 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMultiImage was null, expected non-null bool.'); final int? arg_limit = (args[3] as int?); try { - final List output = await api.pickMultiImage(arg_maxSize!, arg_imageQuality, arg_requestFullMetadata!, arg_limit); + final List output = await api.pickMultiImage(arg_maxSize!, + arg_imageQuality, arg_requestFullMetadata!, arg_limit); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel __pigeon_channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo', + pigeonChannelCodec, + binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(__pigeon_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(__pigeon_channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo was null.'); final List args = (message as List?)!; - final SourceSpecification? arg_source = (args[0] as SourceSpecification?); + final SourceSpecification? arg_source = + (args[0] as SourceSpecification?); assert(arg_source != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickVideo was null, expected non-null SourceSpecification.'); final int? arg_maxDurationSeconds = (args[1] as int?); try { - final String? output = await api.pickVideo(arg_source!, arg_maxDurationSeconds); + final String? output = + await api.pickVideo(arg_source!, arg_maxDurationSeconds); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel __pigeon_channel = BasicMessageChannel( - 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( + 'dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia', + pigeonChannelCodec, + binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(__pigeon_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(__pigeon_channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(__pigeon_channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia was null.'); + 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia was null.'); final List args = (message as List?)!; - final MediaSelectionOptions? arg_mediaSelectionOptions = (args[0] as MediaSelectionOptions?); + final MediaSelectionOptions? arg_mediaSelectionOptions = + (args[0] as MediaSelectionOptions?); assert(arg_mediaSelectionOptions != null, 'Argument for dev.flutter.pigeon.image_picker_ios.ImagePickerApi.pickMedia was null, expected non-null MediaSelectionOptions.'); try { - final List output = await api.pickMedia(arg_mediaSelectionOptions!); + final List output = + await api.pickMedia(arg_mediaSelectionOptions!); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } From b3036ff2faa74ac2f065a8ebdf5fbc968bc526d3 Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 5 Mar 2024 11:00:19 +0100 Subject: [PATCH 27/45] Fix android test --- .../image_picker_android/test/image_picker_android_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/image_picker_android/test/image_picker_android_test.dart b/packages/image_picker/image_picker_android/test/image_picker_android_test.dart index 630f9f18163..d916469f255 100644 --- a/packages/image_picker/image_picker_android/test/image_picker_android_test.dart +++ b/packages/image_picker/image_picker_android/test/image_picker_android_test.dart @@ -765,7 +765,7 @@ void main() { test('does not accept an invalid limit argument', () { expect( () => picker.getMedia( - options: const MediaOptions( + options: MediaOptions.createAndValidate( allowMultiple: true, limit: -1, ), @@ -775,7 +775,7 @@ void main() { expect( () => picker.getMedia( - options: const MediaOptions( + options: MediaOptions.createAndValidate( allowMultiple: true, limit: 0, ), From 17d2b6efcb9df8be1078188012bfe87e4882a0c2 Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 5 Mar 2024 11:01:13 +0100 Subject: [PATCH 28/45] Check sdk version --- .../io/flutter/plugins/imagepicker/ImagePickerDelegate.java | 5 +++-- .../io/flutter/plugins/imagepicker/ImagePickerPlugin.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index f3fea9e2a40..83dbc53c7f1 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -303,8 +303,9 @@ private void launchPickMediaFromGalleryIntent(Messages.GeneralOptions generalOpt if (limit != null) { effectiveLimit = Math.toIntExact(limit); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R - && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + || Build.VERSION.SDK_INT >= Build.VERSION_CODES.R + && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { effectiveLimit = MediaStore.getPickImagesMaxLimit(); } else { effectiveLimit = Integer.MAX_VALUE; diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index fe8cfd9ed48..d0bb8caa5a3 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -325,8 +325,9 @@ public void pickImages( if (limit != null) { effectiveLimit = Math.toIntExact(limit); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R - && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + || Build.VERSION.SDK_INT >= Build.VERSION_CODES.R + && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { effectiveLimit = MediaStore.getPickImagesMaxLimit(); } else { effectiveLimit = Integer.MAX_VALUE; From 7b59aaa14afaf44f414992809807d72dc5272b3e Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 5 Mar 2024 11:21:36 +0100 Subject: [PATCH 29/45] Check only is extension version is available --- .../io/flutter/plugins/imagepicker/ImagePickerDelegate.java | 4 +--- .../io/flutter/plugins/imagepicker/ImagePickerPlugin.java | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index 83dbc53c7f1..4dd3aa595ff 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -303,9 +303,7 @@ private void launchPickMediaFromGalleryIntent(Messages.GeneralOptions generalOpt if (limit != null) { effectiveLimit = Math.toIntExact(limit); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU - || Build.VERSION.SDK_INT >= Build.VERSION_CODES.R - && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { + } else if (SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { effectiveLimit = MediaStore.getPickImagesMaxLimit(); } else { effectiveLimit = Integer.MAX_VALUE; diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index d0bb8caa5a3..21e51165ca3 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -325,9 +325,7 @@ public void pickImages( if (limit != null) { effectiveLimit = Math.toIntExact(limit); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU - || Build.VERSION.SDK_INT >= Build.VERSION_CODES.R - && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { + } else if (SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { effectiveLimit = MediaStore.getPickImagesMaxLimit(); } else { effectiveLimit = Integer.MAX_VALUE; From 71147c33b476f5458db2639a24578ae32e68190a Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 5 Mar 2024 12:00:24 +0100 Subject: [PATCH 30/45] Verify is getPickImagesMaxLimit available --- .../io/flutter/plugins/imagepicker/ImagePickerDelegate.java | 4 +++- .../io/flutter/plugins/imagepicker/ImagePickerPlugin.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index 4dd3aa595ff..cd8d318f951 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -303,7 +303,9 @@ private void launchPickMediaFromGalleryIntent(Messages.GeneralOptions generalOpt if (limit != null) { effectiveLimit = Math.toIntExact(limit); - } else if (SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R + && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2)) { effectiveLimit = MediaStore.getPickImagesMaxLimit(); } else { effectiveLimit = Integer.MAX_VALUE; diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index 21e51165ca3..ffcc4bfa514 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -325,7 +325,9 @@ public void pickImages( if (limit != null) { effectiveLimit = Math.toIntExact(limit); - } else if (SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R + && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2)) { effectiveLimit = MediaStore.getPickImagesMaxLimit(); } else { effectiveLimit = Integer.MAX_VALUE; From 029b1de7502fd8e7c99768f6aa123e3057b14166 Mon Sep 17 00:00:00 2001 From: pdenert Date: Wed, 6 Mar 2024 03:09:53 +0100 Subject: [PATCH 31/45] Update image_picker changelog --- packages/image_picker/image_picker/CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index 4d9e22c7bdf..d415c1f065e 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,7 +1,8 @@ ## 1.0.8 -* Adds limit parameter to `MediaOptions` and `MultiImagePickerOptions` that sets a limit to -* how many media or image items can be selected. Supports its use only on iOS and Android. +* Adds limit parameter to `MediaOptions` and `MultiImagePickerOptions` which limits + the number of media that can be selected. + * Currently supported only on iOS and Android. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. * Updates support matrix in README to indicate that iOS 11 is no longer supported. * Clients on versions of Flutter that still support iOS 11 can continue to use this From 0dc50cd8830a200f9e2226de22563ea1e8542d56 Mon Sep 17 00:00:00 2001 From: pdenert Date: Wed, 6 Mar 2024 10:47:18 +0100 Subject: [PATCH 32/45] Remove limit from getMultiImage overrides in iOS and Android --- .../lib/image_picker_android.dart | 2 -- .../test/image_picker_android_test.dart | 14 ---------- .../lib/image_picker_ios.dart | 2 -- .../test/image_picker_ios_test.dart | 27 ------------------- 4 files changed, 45 deletions(-) diff --git a/packages/image_picker/image_picker_android/lib/image_picker_android.dart b/packages/image_picker/image_picker_android/lib/image_picker_android.dart index 4f55fc30dee..a498ead6faa 100644 --- a/packages/image_picker/image_picker_android/lib/image_picker_android.dart +++ b/packages/image_picker/image_picker_android/lib/image_picker_android.dart @@ -204,13 +204,11 @@ class ImagePickerAndroid extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) async { final List paths = await _getMultiImagePath( maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: imageQuality, - limit: limit, ); if (paths.isEmpty) { return null; diff --git a/packages/image_picker/image_picker_android/test/image_picker_android_test.dart b/packages/image_picker/image_picker_android/test/image_picker_android_test.dart index d916469f255..548ea51f84d 100644 --- a/packages/image_picker/image_picker_android/test/image_picker_android_test.dart +++ b/packages/image_picker/image_picker_android/test/image_picker_android_test.dart @@ -474,13 +474,11 @@ void main() { maxWidth: 10.0, maxHeight: 20.0, imageQuality: 70, - limit: 5, ); expect(api.passedImageOptions?.maxWidth, 10.0); expect(api.passedImageOptions?.maxHeight, 20.0); expect(api.passedImageOptions?.quality, 70); - expect(api.limit, 5); }); test('does not accept a negative width or height argument', () { @@ -507,18 +505,6 @@ void main() { ); }); - test('does not accept an invalid limit argument', () { - expect( - () => picker.getMultiImage(limit: -1), - throwsArgumentError, - ); - - expect( - () => picker.getMultiImage(limit: 0), - throwsArgumentError, - ); - }); - test('handles an empty image path response gracefully', () async { api.returnValue = []; diff --git a/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart b/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart index b46c439277d..64151d45494 100644 --- a/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart +++ b/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart @@ -283,7 +283,6 @@ class ImagePickerIOS extends ImagePickerPlatform { double? maxWidth, double? maxHeight, int? imageQuality, - int? limit, }) async { final List paths = await _pickMultiImageAsPath( options: MultiImagePickerOptions( @@ -292,7 +291,6 @@ class ImagePickerIOS extends ImagePickerPlatform { maxHeight: maxHeight, imageQuality: imageQuality, ), - limit: limit, ), ); // Convert an empty list to a null return since that was the legacy behavior diff --git a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart index 8fcd33b53f0..222c25ed561 100644 --- a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart +++ b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart @@ -812,12 +812,6 @@ void main() { maxHeight: 20.0, imageQuality: 70, ); - await picker.getMultiImage( - maxWidth: 10.0, - maxHeight: 20.0, - imageQuality: 70, - limit: 5, - ); expect( log.calls, @@ -878,14 +872,6 @@ void main() { 'requestFullMetadata': true, 'limit': null, }), - const _LoggedMethodCall('pickMultiImage', - arguments: { - 'maxWidth': 10.0, - 'maxHeight': 20.0, - 'imageQuality': 70, - 'requestFullMetadata': true, - 'limit': 5, - }), ], ); }); @@ -916,19 +902,6 @@ void main() { ); }); - test('does not accept a invalid limit argument', () { - log.returnValue = ['0', '1']; - expect( - () => picker.getMultiImage(limit: -1), - throwsArgumentError, - ); - - expect( - () => picker.getMultiImage(limit: 0), - throwsArgumentError, - ); - }); - test('returns null for an empty list', () async { log.returnValue = []; From d6d675719b1a564925d6d8039f71c244ef5fc198 Mon Sep 17 00:00:00 2001 From: pdenert Date: Wed, 13 Mar 2024 19:47:33 +0100 Subject: [PATCH 33/45] Throw error when allowMultiple is false and limit is not null in MediaOptions --- .../image_picker/lib/image_picker.dart | 2 +- .../test/image_picker_android_test.dart | 43 +++++++++++-------- .../test/image_picker_ios_test.dart | 27 +++++++----- .../method_channel_image_picker.dart | 5 --- .../lib/src/types/media_options.dart | 7 --- 5 files changed, 44 insertions(+), 40 deletions(-) diff --git a/packages/image_picker/image_picker/lib/image_picker.dart b/packages/image_picker/image_picker/lib/image_picker.dart index bc8eb430747..00327200e0e 100755 --- a/packages/image_picker/image_picker/lib/image_picker.dart +++ b/packages/image_picker/image_picker/lib/image_picker.dart @@ -245,7 +245,7 @@ class ImagePicker { bool requestFullMetadata = true, }) { return platform.getMedia( - options: MediaOptions.createAndValidate( + options: MediaOptions( allowMultiple: true, imageOptions: ImageOptions.createAndValidate( maxHeight: maxHeight, diff --git a/packages/image_picker/image_picker_android/test/image_picker_android_test.dart b/packages/image_picker/image_picker_android/test/image_picker_android_test.dart index 548ea51f84d..a166bff049f 100644 --- a/packages/image_picker/image_picker_android/test/image_picker_android_test.dart +++ b/packages/image_picker/image_picker_android/test/image_picker_android_test.dart @@ -662,7 +662,7 @@ void main() { api.returnValue = fakePaths; final List files = await picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, ), ); @@ -675,7 +675,7 @@ void main() { test('passes default image options', () async { await picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, ), ); @@ -688,9 +688,9 @@ void main() { test('passes image option arguments correctly', () async { await picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, - imageOptions: ImageOptions( + imageOptions: const ImageOptions( maxWidth: 10.0, maxHeight: 20.0, imageQuality: 70, @@ -707,9 +707,9 @@ void main() { test('does not accept a negative width or height argument', () { expect( () => picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, - imageOptions: ImageOptions(maxWidth: -1.0), + imageOptions: const ImageOptions(maxWidth: -1.0), ), ), throwsArgumentError, @@ -717,9 +717,9 @@ void main() { expect( () => picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, - imageOptions: ImageOptions(maxHeight: -1.0), + imageOptions: const ImageOptions(maxHeight: -1.0), ), ), throwsArgumentError, @@ -729,9 +729,9 @@ void main() { test('does not accept an invalid imageQuality argument', () { expect( () => picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, - imageOptions: ImageOptions(imageQuality: -1), + imageOptions: const ImageOptions(imageQuality: -1), ), ), throwsArgumentError, @@ -739,9 +739,9 @@ void main() { expect( () => picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, - imageOptions: ImageOptions(imageQuality: 101), + imageOptions: const ImageOptions(imageQuality: 101), ), ), throwsArgumentError, @@ -751,7 +751,7 @@ void main() { test('does not accept an invalid limit argument', () { expect( () => picker.getMedia( - options: MediaOptions.createAndValidate( + options: MediaOptions( allowMultiple: true, limit: -1, ), @@ -761,7 +761,7 @@ void main() { expect( () => picker.getMedia( - options: MediaOptions.createAndValidate( + options: MediaOptions( allowMultiple: true, limit: 0, ), @@ -770,12 +770,21 @@ void main() { ); }); + test('does not accept a not null limit when allowMultiple is false', () { + expect( + () => picker.getMedia( + options: MediaOptions(allowMultiple: false, limit: 5), + ), + throwsArgumentError, + ); + }); + test('handles an empty path response gracefully', () async { api.returnValue = []; expect( await picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, ), ), @@ -784,7 +793,7 @@ void main() { test('defaults to not using Android Photo Picker', () async { await picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, ), ); @@ -795,7 +804,7 @@ void main() { test('allows using Android Photo Picker', () async { picker.useAndroidPhotoPicker = true; await picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, ), ); diff --git a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart index 222c25ed561..21b73df3d4d 100644 --- a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart +++ b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart @@ -912,7 +912,7 @@ void main() { group('#getMedia', () { test('calls the method correctly', () async { log.returnValue = ['0', '1']; - await picker.getMedia(options: const MediaOptions(allowMultiple: true)); + await picker.getMedia(options: MediaOptions(allowMultiple: true)); expect( log.calls, @@ -931,7 +931,7 @@ void main() { test('passes the width and height arguments correctly', () async { log.returnValue = ['0', '1']; - await picker.getMedia(options: const MediaOptions(allowMultiple: true)); + await picker.getMedia(options: MediaOptions(allowMultiple: true)); await picker.getMedia( options: MediaOptions( allowMultiple: true, @@ -1064,9 +1064,9 @@ void main() { test('passes request metadata argument correctly', () async { log.returnValue = ['0', '1']; await picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, - imageOptions: ImageOptions(requestFullMetadata: false), + imageOptions: const ImageOptions(requestFullMetadata: false), )); expect( @@ -1087,7 +1087,7 @@ void main() { test('passes allowMultiple argument correctly', () async { log.returnValue = ['0', '1']; await picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: false, )); @@ -1152,7 +1152,7 @@ void main() { log.returnValue = ['0', '1']; expect( () => picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, limit: -1, )), @@ -1161,7 +1161,7 @@ void main() { expect( () => picker.getMedia( - options: const MediaOptions( + options: MediaOptions( allowMultiple: true, limit: 0, )), @@ -1169,12 +1169,19 @@ void main() { ); }); + test('does not accept a not null limit when allowMultiple is false', () { + expect( + () => picker.getMedia( + options: MediaOptions(allowMultiple: false, limit: 5), + ), + throwsArgumentError, + ); + }); + test('handles a empty path response gracefully', () async { log.returnValue = []; - expect( - await picker.getMedia( - options: const MediaOptions(allowMultiple: true)), + expect(await picker.getMedia(options: MediaOptions(allowMultiple: true)), []); }); }); 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 bfdc01e3862..ca58968c4af 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 @@ -265,11 +265,6 @@ class MethodChannelImagePicker extends ImagePickerPlatform { }) async { final ImageOptions imageOptions = options.imageOptions; - final int? limit = options.limit; - if (limit != null && limit < 2) { - throw ArgumentError.value(limit, 'limit', 'cannot be lower than 2'); - } - final Map args = { 'maxImageWidth': imageOptions.maxWidth, 'maxImageHeight': imageOptions.maxHeight, diff --git a/packages/image_picker/image_picker_platform_interface/lib/src/types/media_options.dart b/packages/image_picker/image_picker_platform_interface/lib/src/types/media_options.dart index 9576cadbad8..f9b3160c4b4 100644 --- a/packages/image_picker/image_picker_platform_interface/lib/src/types/media_options.dart +++ b/packages/image_picker/image_picker_platform_interface/lib/src/types/media_options.dart @@ -9,13 +9,6 @@ import '../../image_picker_platform_interface.dart'; /// Specifies options for selecting items when using [ImagePickerPlatform.getMedia]. @immutable class MediaOptions { - /// Construct a new MediaOptions instance. - const MediaOptions({ - this.imageOptions = const ImageOptions(), - required this.allowMultiple, - this.limit, - }); - /// Construct a new MediaOptions instance. /// /// Throws if limit is lower than 2, From 81d5115826edea345c84c3648cbaee64902a98a8 Mon Sep 17 00:00:00 2001 From: pdenert Date: Fri, 15 Mar 2024 01:24:13 +0100 Subject: [PATCH 34/45] Add getLimitFromOption method --- .../imagepicker/ImagePickerDelegate.java | 15 ++------ .../imagepicker/ImagePickerPlugin.java | 15 ++------ .../plugins/imagepicker/ImagePickerUtils.java | 35 +++++++++++++++++++ 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index cd8d318f951..c0f7994f45c 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -298,21 +298,10 @@ private void launchPickMediaFromGalleryIntent(Messages.GeneralOptions generalOpt Intent pickMediaIntent; if (generalOptions.getUsePhotoPicker()) { if (generalOptions.getAllowMultiple()) { - Long limit = generalOptions.getLimit(); - int effectiveLimit; - - if (limit != null) { - effectiveLimit = Math.toIntExact(limit); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU - || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R - && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2)) { - effectiveLimit = MediaStore.getPickImagesMaxLimit(); - } else { - effectiveLimit = Integer.MAX_VALUE; - } + int limit = ImagePickerUtils.getLimitFromOption(generalOptions); pickMediaIntent = - new ActivityResultContracts.PickMultipleVisualMedia(effectiveLimit) + new ActivityResultContracts.PickMultipleVisualMedia(limit) .createIntent( activity, new PickVisualMediaRequest.Builder() diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index ffcc4bfa514..cff20d65b96 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -320,21 +320,10 @@ public void pickImages( setCameraDevice(delegate, source); if (generalOptions.getAllowMultiple()) { - Long limit = generalOptions.getLimit(); - int effectiveLimit; - - if (limit != null) { - effectiveLimit = Math.toIntExact(limit); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU - || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R - && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2)) { - effectiveLimit = MediaStore.getPickImagesMaxLimit(); - } else { - effectiveLimit = Integer.MAX_VALUE; - } + int limit = ImagePickerUtils.getLimitFromOption(generalOptions); delegate.chooseMultiImageFromGallery( - options, generalOptions.getUsePhotoPicker(), effectiveLimit, result); + options, generalOptions.getUsePhotoPicker(), limit, result); } else { switch (source.getType()) { case GALLERY: diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerUtils.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerUtils.java index 6a93c69feb4..ac662fe933c 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerUtils.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerUtils.java @@ -5,10 +5,15 @@ package io.flutter.plugins.imagepicker; import android.Manifest; +import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; +import android.provider.MediaStore; + +import androidx.activity.result.contract.ActivityResultContracts; + import java.util.Arrays; final class ImagePickerUtils { @@ -54,4 +59,34 @@ static boolean needRequestCameraPermission(Context context) { boolean greatOrEqualM = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; return greatOrEqualM && isPermissionPresentInManifest(context, Manifest.permission.CAMERA); } + + + /** + * The system photo picker has a maximum limit of selectable items returned by + * [MediaStore.getPickImagesMaxLimit()] + * On devices supporting picker provided via [ACTION_SYSTEM_FALLBACK_PICK_IMAGES], + * the limit may be ignored if it's higher than the allowed limit. + * On devices not supporting the photo picker, the limit is ignored. + * + * @see MediaStore.EXTRA_PICK_IMAGES_MAX + */ + @SuppressLint({"NewApi", "ClassVerificationFailure"}) + static int getMaxItems() { + if (ActivityResultContracts.PickVisualMedia.isSystemPickerAvailable$activity_release()) { + return MediaStore.getPickImagesMaxLimit(); + } else { + return Integer.MAX_VALUE; + } + } + + static int getLimitFromOption(Messages.GeneralOptions generalOptions) { + Long limit = generalOptions.getLimit(); + int effectiveLimit = getMaxItems(); + + if (limit != null && limit < effectiveLimit) { + effectiveLimit = Math.toIntExact(limit); + } + + return effectiveLimit; + } } From eb7c210feec4c4ea2256129634b028d8a435a865 Mon Sep 17 00:00:00 2001 From: pdenert Date: Sat, 16 Mar 2024 21:07:02 +0100 Subject: [PATCH 35/45] Update android native tests --- .../plugins/imagepicker/ImagePickerDelegateTest.java | 6 +++--- .../flutter/plugins/imagepicker/ImagePickerPluginTest.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java index 92c988cd6bf..623a102eb7d 100644 --- a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java +++ b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java @@ -160,7 +160,7 @@ public void chooseMultiImageFromGallery_whenPendingResultExists_finishesWithAlre ImagePickerDelegate delegate = createDelegateWithPendingResultAndOptions(DEFAULT_IMAGE_OPTIONS, null); - delegate.chooseMultiImageFromGallery(DEFAULT_IMAGE_OPTIONS, false, mockResult); + delegate.chooseMultiImageFromGallery(DEFAULT_IMAGE_OPTIONS, false, Integer.MAX_VALUE, mockResult); verifyFinishedWithAlreadyActiveError(); verifyNoMoreInteractions(mockResult); @@ -207,7 +207,7 @@ public void chooseImageFromGallery_withPhotoPicker_launchesChooseFromGalleryInte public void chooseMultiImageFromGallery_launchesChooseFromGalleryIntent() { ImagePickerDelegate delegate = createDelegate(); - delegate.chooseMultiImageFromGallery(DEFAULT_IMAGE_OPTIONS, true, mockResult); + delegate.chooseMultiImageFromGallery(DEFAULT_IMAGE_OPTIONS, true, Integer.MAX_VALUE, mockResult); verify(mockActivity) .startActivityForResult( @@ -220,7 +220,7 @@ public void chooseMultiImageFromGallery_launchesChooseFromGalleryIntent() { public void chooseMultiImageFromGallery_withPhotoPicker_launchesChooseFromGalleryIntent() { ImagePickerDelegate delegate = createDelegate(); - delegate.chooseMultiImageFromGallery(DEFAULT_IMAGE_OPTIONS, false, mockResult); + delegate.chooseMultiImageFromGallery(DEFAULT_IMAGE_OPTIONS, false, Integer.MAX_VALUE, mockResult); verify(mockActivity) .startActivityForResult( diff --git a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java index b2c281ca540..aaafaff7f4b 100644 --- a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java +++ b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java @@ -171,7 +171,7 @@ public void pickImages_invokesChooseMultiImageFromGallery() { DEFAULT_IMAGE_OPTIONS, GENERAL_OPTIONS_ALLOW_MULTIPLE_DONT_USE_PHOTO_PICKER, mockResult); - verify(mockImagePickerDelegate).chooseMultiImageFromGallery(any(), eq(false), any()); + verify(mockImagePickerDelegate).chooseMultiImageFromGallery(any(), eq(false), any(), any()); verifyNoInteractions(mockResult); } @@ -182,7 +182,7 @@ public void pickImages_usingPhotoPicker_invokesChooseMultiImageFromGallery() { DEFAULT_IMAGE_OPTIONS, GENERAL_OPTIONS_ALLOW_MULTIPLE_USE_PHOTO_PICKER, mockResult); - verify(mockImagePickerDelegate).chooseMultiImageFromGallery(any(), eq(true), any()); + verify(mockImagePickerDelegate).chooseMultiImageFromGallery(any(), eq(true), any(), any()); verifyNoInteractions(mockResult); } From 06c8c81c039779e7716e19f38999be8c405bb500 Mon Sep 17 00:00:00 2001 From: pdenert Date: Sun, 17 Mar 2024 15:06:04 +0100 Subject: [PATCH 36/45] Fix ImagePickerDelegateTests --- .../plugins/imagepicker/ImagePickerDelegate.java | 1 - .../flutter/plugins/imagepicker/ImagePickerPlugin.java | 3 --- .../flutter/plugins/imagepicker/ImagePickerUtils.java | 10 +++------- .../plugins/imagepicker/ImagePickerDelegateTest.java | 9 ++++++--- .../plugins/imagepicker/ImagePickerPluginTest.java | 5 +++-- 5 files changed, 12 insertions(+), 16 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index c0f7994f45c..96bf727a881 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -15,7 +15,6 @@ import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Build; -import android.os.ext.SdkExtensions; import android.provider.MediaStore; import androidx.activity.result.PickVisualMediaRequest; import androidx.activity.result.contract.ActivityResultContracts; diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index cff20d65b96..8096930e7d7 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -6,10 +6,7 @@ import android.app.Activity; import android.app.Application; -import android.os.Build; import android.os.Bundle; -import android.os.ext.SdkExtensions; -import android.provider.MediaStore; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerUtils.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerUtils.java index ac662fe933c..d14056423c4 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerUtils.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerUtils.java @@ -11,9 +11,7 @@ import android.content.pm.PackageManager; import android.os.Build; import android.provider.MediaStore; - import androidx.activity.result.contract.ActivityResultContracts; - import java.util.Arrays; final class ImagePickerUtils { @@ -60,13 +58,11 @@ static boolean needRequestCameraPermission(Context context) { return greatOrEqualM && isPermissionPresentInManifest(context, Manifest.permission.CAMERA); } - /** * The system photo picker has a maximum limit of selectable items returned by - * [MediaStore.getPickImagesMaxLimit()] - * On devices supporting picker provided via [ACTION_SYSTEM_FALLBACK_PICK_IMAGES], - * the limit may be ignored if it's higher than the allowed limit. - * On devices not supporting the photo picker, the limit is ignored. + * [MediaStore.getPickImagesMaxLimit()] On devices supporting picker provided via + * [ACTION_SYSTEM_FALLBACK_PICK_IMAGES], the limit may be ignored if it's higher than the allowed + * limit. On devices not supporting the photo picker, the limit is ignored. * * @see MediaStore.EXTRA_PICK_IMAGES_MAX */ diff --git a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java index 623a102eb7d..81546da52ec 100644 --- a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java +++ b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java @@ -160,7 +160,8 @@ public void chooseMultiImageFromGallery_whenPendingResultExists_finishesWithAlre ImagePickerDelegate delegate = createDelegateWithPendingResultAndOptions(DEFAULT_IMAGE_OPTIONS, null); - delegate.chooseMultiImageFromGallery(DEFAULT_IMAGE_OPTIONS, false, Integer.MAX_VALUE, mockResult); + delegate.chooseMultiImageFromGallery( + DEFAULT_IMAGE_OPTIONS, false, Integer.MAX_VALUE, mockResult); verifyFinishedWithAlreadyActiveError(); verifyNoMoreInteractions(mockResult); @@ -207,7 +208,8 @@ public void chooseImageFromGallery_withPhotoPicker_launchesChooseFromGalleryInte public void chooseMultiImageFromGallery_launchesChooseFromGalleryIntent() { ImagePickerDelegate delegate = createDelegate(); - delegate.chooseMultiImageFromGallery(DEFAULT_IMAGE_OPTIONS, true, Integer.MAX_VALUE, mockResult); + delegate.chooseMultiImageFromGallery( + DEFAULT_IMAGE_OPTIONS, true, Integer.MAX_VALUE, mockResult); verify(mockActivity) .startActivityForResult( @@ -220,7 +222,8 @@ public void chooseMultiImageFromGallery_launchesChooseFromGalleryIntent() { public void chooseMultiImageFromGallery_withPhotoPicker_launchesChooseFromGalleryIntent() { ImagePickerDelegate delegate = createDelegate(); - delegate.chooseMultiImageFromGallery(DEFAULT_IMAGE_OPTIONS, false, Integer.MAX_VALUE, mockResult); + delegate.chooseMultiImageFromGallery( + DEFAULT_IMAGE_OPTIONS, false, Integer.MAX_VALUE, mockResult); verify(mockActivity) .startActivityForResult( diff --git a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java index aaafaff7f4b..9811da81d93 100644 --- a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java +++ b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java @@ -10,6 +10,7 @@ import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -171,7 +172,7 @@ public void pickImages_invokesChooseMultiImageFromGallery() { DEFAULT_IMAGE_OPTIONS, GENERAL_OPTIONS_ALLOW_MULTIPLE_DONT_USE_PHOTO_PICKER, mockResult); - verify(mockImagePickerDelegate).chooseMultiImageFromGallery(any(), eq(false), any(), any()); + verify(mockImagePickerDelegate).chooseMultiImageFromGallery(any(), eq(false), anyInt(), any()); verifyNoInteractions(mockResult); } @@ -182,7 +183,7 @@ public void pickImages_usingPhotoPicker_invokesChooseMultiImageFromGallery() { DEFAULT_IMAGE_OPTIONS, GENERAL_OPTIONS_ALLOW_MULTIPLE_USE_PHOTO_PICKER, mockResult); - verify(mockImagePickerDelegate).chooseMultiImageFromGallery(any(), eq(true), any(), any()); + verify(mockImagePickerDelegate).chooseMultiImageFromGallery(any(), eq(true), anyInt(), any()); verifyNoInteractions(mockResult); } From 618bf3d49be5c25c25917a653f500b5551041053 Mon Sep 17 00:00:00 2001 From: pdenert Date: Sun, 17 Mar 2024 18:12:03 +0100 Subject: [PATCH 37/45] Add android native tests for limit in pickImages --- .../imagepicker/ImagePickerPluginTest.java | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java index 9811da81d93..cf088b59b19 100644 --- a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java +++ b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java @@ -10,7 +10,6 @@ import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -53,6 +52,19 @@ public class ImagePickerPluginTest { new GeneralOptions.Builder().setUsePhotoPicker(false).setAllowMultiple(false).build(); private static final GeneralOptions GENERAL_OPTIONS_ALLOW_MULTIPLE_DONT_USE_PHOTO_PICKER = new GeneralOptions.Builder().setUsePhotoPicker(false).setAllowMultiple(true).build(); + private static final GeneralOptions + GENERAL_OPTIONS_ALLOW_MULTIPLE_DONT_USE_PHOTO_PICKER_WITH_LIMIT = + new GeneralOptions.Builder() + .setUsePhotoPicker(false) + .setAllowMultiple(true) + .setLimit((long) 5) + .build(); + private static final GeneralOptions GENERAL_OPTIONS_ALLOW_MULTIPLE_USE_PHOTO_PICKER_WITH_LIMIT = + new GeneralOptions.Builder() + .setUsePhotoPicker(true) + .setAllowMultiple(true) + .setLimit((long) 5) + .build(); private static final SourceSpecification SOURCE_GALLERY = new SourceSpecification.Builder().setType(Messages.SourceType.GALLERY).build(); private static final SourceSpecification SOURCE_CAMERA_FRONT = @@ -172,7 +184,8 @@ public void pickImages_invokesChooseMultiImageFromGallery() { DEFAULT_IMAGE_OPTIONS, GENERAL_OPTIONS_ALLOW_MULTIPLE_DONT_USE_PHOTO_PICKER, mockResult); - verify(mockImagePickerDelegate).chooseMultiImageFromGallery(any(), eq(false), anyInt(), any()); + verify(mockImagePickerDelegate) + .chooseMultiImageFromGallery(any(), eq(false), eq(Integer.MAX_VALUE), any()); verifyNoInteractions(mockResult); } @@ -183,7 +196,30 @@ public void pickImages_usingPhotoPicker_invokesChooseMultiImageFromGallery() { DEFAULT_IMAGE_OPTIONS, GENERAL_OPTIONS_ALLOW_MULTIPLE_USE_PHOTO_PICKER, mockResult); - verify(mockImagePickerDelegate).chooseMultiImageFromGallery(any(), eq(true), anyInt(), any()); + verify(mockImagePickerDelegate) + .chooseMultiImageFromGallery(any(), eq(true), eq(Integer.MAX_VALUE), any()); + verifyNoInteractions(mockResult); + } + + @Test + public void pickImages_usingPhotoPicker_withLimit5_invokesChooseMultiImageFromGallery() { + plugin.pickImages( + SOURCE_GALLERY, + DEFAULT_IMAGE_OPTIONS, + GENERAL_OPTIONS_ALLOW_MULTIPLE_USE_PHOTO_PICKER_WITH_LIMIT, + mockResult); + verify(mockImagePickerDelegate).chooseMultiImageFromGallery(any(), eq(true), eq(5), any()); + verifyNoInteractions(mockResult); + } + + @Test + public void pickImages_withLimit5_invokesChooseMultiImageFromGallery() { + plugin.pickImages( + SOURCE_GALLERY, + DEFAULT_IMAGE_OPTIONS, + GENERAL_OPTIONS_ALLOW_MULTIPLE_DONT_USE_PHOTO_PICKER_WITH_LIMIT, + mockResult); + verify(mockImagePickerDelegate).chooseMultiImageFromGallery(any(), eq(false), eq(5), any()); verifyNoInteractions(mockResult); } From 85d17ab5ae9cc696fb24a5428180a8ecc9925bdf Mon Sep 17 00:00:00 2001 From: pdenert Date: Mon, 18 Mar 2024 12:43:04 +0100 Subject: [PATCH 38/45] Validate media options for allowMultiple and limit --- .../image_picker/lib/image_picker.dart | 4 +-- .../lib/image_picker_android.dart | 29 ++++++++++++--- .../test/image_picker_android_test.dart | 36 +++++++++---------- .../lib/image_picker_ios.dart | 10 ++++++ .../test/image_picker_ios_test.dart | 20 ++++++----- .../lib/src/types/media_options.dart | 7 ++++ 6 files changed, 72 insertions(+), 34 deletions(-) diff --git a/packages/image_picker/image_picker/lib/image_picker.dart b/packages/image_picker/image_picker/lib/image_picker.dart index 00327200e0e..246fe3a4ca1 100755 --- a/packages/image_picker/image_picker/lib/image_picker.dart +++ b/packages/image_picker/image_picker/lib/image_picker.dart @@ -188,7 +188,7 @@ class ImagePicker { bool requestFullMetadata = true, }) async { final List listMedia = await platform.getMedia( - options: MediaOptions( + options: MediaOptions.createAndValidate( imageOptions: ImageOptions.createAndValidate( maxHeight: maxHeight, maxWidth: maxWidth, @@ -245,7 +245,7 @@ class ImagePicker { bool requestFullMetadata = true, }) { return platform.getMedia( - options: MediaOptions( + options: MediaOptions.createAndValidate( allowMultiple: true, imageOptions: ImageOptions.createAndValidate( maxHeight: maxHeight, diff --git a/packages/image_picker/image_picker_android/lib/image_picker_android.dart b/packages/image_picker/image_picker_android/lib/image_picker_android.dart index a498ead6faa..2bcebe26802 100644 --- a/packages/image_picker/image_picker_android/lib/image_picker_android.dart +++ b/packages/image_picker/image_picker_android/lib/image_picker_android.dart @@ -241,11 +241,7 @@ class ImagePickerAndroid extends ImagePickerPlatform { }) async { return (await _hostApi.pickMedia( _mediaOptionsToMediaSelectionOptions(options), - GeneralOptions( - allowMultiple: options.allowMultiple, - usePhotoPicker: useAndroidPhotoPicker, - limit: options.limit, - ), + _mediaOptionsToGeneralOptions(options), )) .map((String? path) => XFile(path!)) .toList(); @@ -298,6 +294,29 @@ class ImagePickerAndroid extends ImagePickerPlatform { quality: imageQuality ?? 100, maxHeight: maxHeight, maxWidth: maxWidth); } + GeneralOptions _mediaOptionsToGeneralOptions(MediaOptions options) { + final bool allowMultiple = options.allowMultiple; + final int? limit = options.limit; + + if (!allowMultiple && limit != null) { + throw ArgumentError.value( + allowMultiple, + 'allowMultiple', + 'cannot be false, when limit is not null', + ); + } + + if (limit != null && limit < 2) { + throw ArgumentError.value(limit, 'limit', 'cannot be lower then 2'); + } + + return GeneralOptions( + allowMultiple: allowMultiple, + usePhotoPicker: useAndroidPhotoPicker, + limit: limit, + ); + } + @override Future retrieveLostData() async { final LostDataResponse result = await getLostData(); diff --git a/packages/image_picker/image_picker_android/test/image_picker_android_test.dart b/packages/image_picker/image_picker_android/test/image_picker_android_test.dart index a166bff049f..172b135ac0a 100644 --- a/packages/image_picker/image_picker_android/test/image_picker_android_test.dart +++ b/packages/image_picker/image_picker_android/test/image_picker_android_test.dart @@ -662,7 +662,7 @@ void main() { api.returnValue = fakePaths; final List files = await picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, ), ); @@ -675,7 +675,7 @@ void main() { test('passes default image options', () async { await picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, ), ); @@ -688,9 +688,9 @@ void main() { test('passes image option arguments correctly', () async { await picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, - imageOptions: const ImageOptions( + imageOptions: ImageOptions( maxWidth: 10.0, maxHeight: 20.0, imageQuality: 70, @@ -707,9 +707,9 @@ void main() { test('does not accept a negative width or height argument', () { expect( () => picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, - imageOptions: const ImageOptions(maxWidth: -1.0), + imageOptions: ImageOptions(maxWidth: -1.0), ), ), throwsArgumentError, @@ -717,9 +717,9 @@ void main() { expect( () => picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, - imageOptions: const ImageOptions(maxHeight: -1.0), + imageOptions: ImageOptions(maxHeight: -1.0), ), ), throwsArgumentError, @@ -729,9 +729,9 @@ void main() { test('does not accept an invalid imageQuality argument', () { expect( () => picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, - imageOptions: const ImageOptions(imageQuality: -1), + imageOptions: ImageOptions(imageQuality: -1), ), ), throwsArgumentError, @@ -739,9 +739,9 @@ void main() { expect( () => picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, - imageOptions: const ImageOptions(imageQuality: 101), + imageOptions: ImageOptions(imageQuality: 101), ), ), throwsArgumentError, @@ -751,7 +751,7 @@ void main() { test('does not accept an invalid limit argument', () { expect( () => picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, limit: -1, ), @@ -761,7 +761,7 @@ void main() { expect( () => picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, limit: 0, ), @@ -773,7 +773,7 @@ void main() { test('does not accept a not null limit when allowMultiple is false', () { expect( () => picker.getMedia( - options: MediaOptions(allowMultiple: false, limit: 5), + options: const MediaOptions(allowMultiple: false, limit: 5), ), throwsArgumentError, ); @@ -784,7 +784,7 @@ void main() { expect( await picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, ), ), @@ -793,7 +793,7 @@ void main() { test('defaults to not using Android Photo Picker', () async { await picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, ), ); @@ -804,7 +804,7 @@ void main() { test('allows using Android Photo Picker', () async { picker.useAndroidPhotoPicker = true; await picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, ), ); diff --git a/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart b/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart index 64151d45494..96166130797 100644 --- a/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart +++ b/packages/image_picker/image_picker_ios/lib/image_picker_ios.dart @@ -218,7 +218,17 @@ class ImagePickerIOS extends ImagePickerPlatform { final MaxSize maxSize = _imageOptionsToMaxSizeWithValidation(mediaOptions.imageOptions); + final bool allowMultiple = mediaOptions.allowMultiple; final int? limit = mediaOptions.limit; + + if (!allowMultiple && limit != null) { + throw ArgumentError.value( + allowMultiple, + 'allowMultiple', + 'cannot be false, when limit is not null', + ); + } + if (limit != null && limit < 2) { throw ArgumentError.value(limit, 'limit', 'cannot be lower than 2'); } diff --git a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart index 21b73df3d4d..c2e5f74763f 100644 --- a/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart +++ b/packages/image_picker/image_picker_ios/test/image_picker_ios_test.dart @@ -912,7 +912,7 @@ void main() { group('#getMedia', () { test('calls the method correctly', () async { log.returnValue = ['0', '1']; - await picker.getMedia(options: MediaOptions(allowMultiple: true)); + await picker.getMedia(options: const MediaOptions(allowMultiple: true)); expect( log.calls, @@ -931,7 +931,7 @@ void main() { test('passes the width and height arguments correctly', () async { log.returnValue = ['0', '1']; - await picker.getMedia(options: MediaOptions(allowMultiple: true)); + await picker.getMedia(options: const MediaOptions(allowMultiple: true)); await picker.getMedia( options: MediaOptions( allowMultiple: true, @@ -1064,9 +1064,9 @@ void main() { test('passes request metadata argument correctly', () async { log.returnValue = ['0', '1']; await picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, - imageOptions: const ImageOptions(requestFullMetadata: false), + imageOptions: ImageOptions(requestFullMetadata: false), )); expect( @@ -1087,7 +1087,7 @@ void main() { test('passes allowMultiple argument correctly', () async { log.returnValue = ['0', '1']; await picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: false, )); @@ -1152,7 +1152,7 @@ void main() { log.returnValue = ['0', '1']; expect( () => picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, limit: -1, )), @@ -1161,7 +1161,7 @@ void main() { expect( () => picker.getMedia( - options: MediaOptions( + options: const MediaOptions( allowMultiple: true, limit: 0, )), @@ -1172,7 +1172,7 @@ void main() { test('does not accept a not null limit when allowMultiple is false', () { expect( () => picker.getMedia( - options: MediaOptions(allowMultiple: false, limit: 5), + options: const MediaOptions(allowMultiple: false, limit: 5), ), throwsArgumentError, ); @@ -1181,7 +1181,9 @@ void main() { test('handles a empty path response gracefully', () async { log.returnValue = []; - expect(await picker.getMedia(options: MediaOptions(allowMultiple: true)), + expect( + await picker.getMedia( + options: const MediaOptions(allowMultiple: true)), []); }); }); diff --git a/packages/image_picker/image_picker_platform_interface/lib/src/types/media_options.dart b/packages/image_picker/image_picker_platform_interface/lib/src/types/media_options.dart index f9b3160c4b4..9576cadbad8 100644 --- a/packages/image_picker/image_picker_platform_interface/lib/src/types/media_options.dart +++ b/packages/image_picker/image_picker_platform_interface/lib/src/types/media_options.dart @@ -9,6 +9,13 @@ import '../../image_picker_platform_interface.dart'; /// Specifies options for selecting items when using [ImagePickerPlatform.getMedia]. @immutable class MediaOptions { + /// Construct a new MediaOptions instance. + const MediaOptions({ + this.imageOptions = const ImageOptions(), + required this.allowMultiple, + this.limit, + }); + /// Construct a new MediaOptions instance. /// /// Throws if limit is lower than 2, From a89fe2ecbb60b2394d60c5838aa30fe131333f4c Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 9 Apr 2024 09:27:49 +0200 Subject: [PATCH 39/45] Remove platform interface changes --- .../lib/src/method_channel/method_channel_image_picker.dart | 4 ---- 1 file changed, 4 deletions(-) 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 ca58968c4af..943ea760995 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 @@ -73,10 +73,6 @@ class MethodChannelImagePicker extends ImagePickerPlatform { throw ArgumentError.value(maxHeight, 'maxHeight', 'cannot be negative'); } - if (limit != null && limit < 2) { - throw ArgumentError.value(limit, 'limit', 'cannot be lower than 2'); - } - return _channel.invokeMethod?>( 'pickMultiImage', { From c5e22806d3c2a42663b178519097dffd5baf0abf Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 9 Apr 2024 09:32:56 +0200 Subject: [PATCH 40/45] Remove dependency override and update versions --- .../image_picker/image_picker/example/pubspec.yaml | 7 +------ packages/image_picker/image_picker/pubspec.yaml | 11 +++-------- .../image_picker/image_picker_android/pubspec.yaml | 7 +------ packages/image_picker/image_picker_ios/pubspec.yaml | 9 ++------- 4 files changed, 7 insertions(+), 27 deletions(-) diff --git a/packages/image_picker/image_picker/example/pubspec.yaml b/packages/image_picker/image_picker/example/pubspec.yaml index 6044ea4aabf..4b649007aed 100644 --- a/packages/image_picker/image_picker/example/pubspec.yaml +++ b/packages/image_picker/image_picker/example/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ - image_picker_platform_interface: ^2.8.0 + image_picker_platform_interface: ^2.10.0 mime: ^1.0.4 video_player: ^2.7.0 @@ -31,8 +31,3 @@ dev_dependencies: flutter: uses-material-design: true - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_android: {path: ../../../image_picker/image_picker_android}, image_picker_for_web: {path: ../../../image_picker/image_picker_for_web}, image_picker_ios: {path: ../../../image_picker/image_picker_ios}, image_picker_linux: {path: ../../../image_picker/image_picker_linux}, image_picker_macos: {path: ../../../image_picker/image_picker_macos}, image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}, image_picker_windows: {path: ../../../image_picker/image_picker_windows}} diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index ba77914a2ca..24ddce97b59 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -28,12 +28,12 @@ flutter: dependencies: flutter: sdk: flutter - image_picker_android: ^0.8.7 + image_picker_android: ^0.8.10 image_picker_for_web: ">=2.2.0 <4.0.0" - image_picker_ios: ^0.8.9+1 + image_picker_ios: ^0.8.10 image_picker_linux: ^0.2.1 image_picker_macos: ^0.2.1 - image_picker_platform_interface: ^2.8.0 + image_picker_platform_interface: ^2.10.0 image_picker_windows: ^0.2.1 dev_dependencies: @@ -49,8 +49,3 @@ topics: - image-picker - files - file-selection - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_android: {path: ../../image_picker/image_picker_android}, image_picker_for_web: {path: ../../image_picker/image_picker_for_web}, image_picker_ios: {path: ../../image_picker/image_picker_ios}, image_picker_linux: {path: ../../image_picker/image_picker_linux}, image_picker_macos: {path: ../../image_picker/image_picker_macos}, image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}, image_picker_windows: {path: ../../image_picker/image_picker_windows}} diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml index e9b6a66e8d9..4bfc1d7937c 100755 --- a/packages/image_picker/image_picker_android/pubspec.yaml +++ b/packages/image_picker/image_picker_android/pubspec.yaml @@ -21,7 +21,7 @@ dependencies: flutter: sdk: flutter flutter_plugin_android_lifecycle: ^2.0.1 - image_picker_platform_interface: ^2.8.0 + image_picker_platform_interface: ^2.10.0 dev_dependencies: flutter_test: @@ -34,8 +34,3 @@ topics: - image-picker - files - file-selection - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_ios/pubspec.yaml b/packages/image_picker/image_picker_ios/pubspec.yaml index f3a4dc89c72..90140f375c5 100755 --- a/packages/image_picker/image_picker_ios/pubspec.yaml +++ b/packages/image_picker/image_picker_ios/pubspec.yaml @@ -19,7 +19,7 @@ flutter: dependencies: flutter: sdk: flutter - image_picker_platform_interface: ^2.8.0 + image_picker_platform_interface: ^2.10.0 dev_dependencies: flutter_test: @@ -31,9 +31,4 @@ topics: - camera - image-picker - files - - file-selection - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_platform_interface: {path: ../../image_picker/image_picker_platform_interface}} + - file-selection \ No newline at end of file From 39b1df572ca6c96f6c65d0f008ed10349dab473c Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 9 Apr 2024 09:38:48 +0200 Subject: [PATCH 41/45] Donwgrade versions in example package --- packages/image_picker/image_picker/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index 24ddce97b59..203879bec40 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -28,9 +28,9 @@ flutter: dependencies: flutter: sdk: flutter - image_picker_android: ^0.8.10 + image_picker_android: ^0.8.7 image_picker_for_web: ">=2.2.0 <4.0.0" - image_picker_ios: ^0.8.10 + image_picker_ios: ^0.8.8 image_picker_linux: ^0.2.1 image_picker_macos: ^0.2.1 image_picker_platform_interface: ^2.10.0 From 3e4865c88e9026cccd6392527d09f85d3cf1fe83 Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 9 Apr 2024 09:45:50 +0200 Subject: [PATCH 42/45] Bump dart and flutter versions --- packages/image_picker/image_picker/pubspec.yaml | 4 ++-- packages/image_picker/image_picker_android/pubspec.yaml | 4 ++-- packages/image_picker/image_picker_ios/pubspec.yaml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index 203879bec40..5854c9f0211 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -6,8 +6,8 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 1.1.0 environment: - sdk: ^3.1.0 - flutter: ">=3.13.0" + sdk: ^3.3.0 + flutter: ">=3.19.0" flutter: plugin: diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml index 4bfc1d7937c..8f0606a558e 100755 --- a/packages/image_picker/image_picker_android/pubspec.yaml +++ b/packages/image_picker/image_picker_android/pubspec.yaml @@ -5,8 +5,8 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.8.10 environment: - sdk: ^3.2.0 - flutter: ">=3.16.0" + sdk: ^3.3.0 + flutter: ">=3.19.0" flutter: plugin: diff --git a/packages/image_picker/image_picker_ios/pubspec.yaml b/packages/image_picker/image_picker_ios/pubspec.yaml index 90140f375c5..70d578be360 100755 --- a/packages/image_picker/image_picker_ios/pubspec.yaml +++ b/packages/image_picker/image_picker_ios/pubspec.yaml @@ -5,8 +5,8 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.8.10 environment: - sdk: ^3.2.3 - flutter: ">=3.16.6" + sdk: ^3.3.0 + flutter: ">=3.19.0" flutter: plugin: From 8f8d38a8c581c0b8b3f420afc6bb67487efb8ed5 Mon Sep 17 00:00:00 2001 From: pdenert Date: Tue, 9 Apr 2024 11:45:34 +0200 Subject: [PATCH 43/45] Remove dependency_overrides from examples --- .../image_picker_android/example/pubspec.yaml | 11 +++-------- .../image_picker_ios/example/pubspec.yaml | 11 +++-------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/packages/image_picker/image_picker_android/example/pubspec.yaml b/packages/image_picker/image_picker_android/example/pubspec.yaml index 22c838a79b5..500b47c3578 100644 --- a/packages/image_picker/image_picker_android/example/pubspec.yaml +++ b/packages/image_picker/image_picker_android/example/pubspec.yaml @@ -3,8 +3,8 @@ description: Demonstrates how to use the image_picker plugin. publish_to: none environment: - sdk: ^3.1.0 - flutter: ">=3.13.0" + sdk: ^3.3.0 + flutter: ">=3.19.0" dependencies: flutter: @@ -19,7 +19,7 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ - image_picker_platform_interface: ^2.8.0 + image_picker_platform_interface: ^2.10.0 mime: ^1.0.4 video_player: ^2.1.4 @@ -33,8 +33,3 @@ dev_dependencies: flutter: uses-material-design: true - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_android: {path: ../../../image_picker/image_picker_android}, image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}} diff --git a/packages/image_picker/image_picker_ios/example/pubspec.yaml b/packages/image_picker/image_picker_ios/example/pubspec.yaml index 531dbb74121..57c9e2d83fc 100755 --- a/packages/image_picker/image_picker_ios/example/pubspec.yaml +++ b/packages/image_picker/image_picker_ios/example/pubspec.yaml @@ -3,8 +3,8 @@ description: Demonstrates how to use the image_picker plugin. publish_to: none environment: - sdk: ^3.2.3 - flutter: ">=3.16.6" + sdk: ^3.3.0 + flutter: ">=3.19.0" dependencies: flutter: @@ -16,7 +16,7 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ - image_picker_platform_interface: ^2.8.0 + image_picker_platform_interface: ^2.10.0 mime: ^1.0.4 video_player: ^2.1.4 @@ -28,8 +28,3 @@ dev_dependencies: flutter: uses-material-design: true - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {image_picker_ios: {path: ../../../image_picker/image_picker_ios}, image_picker_platform_interface: {path: ../../../image_picker/image_picker_platform_interface}} From 7d5a6b1741bf1631fd89bfb038ee7ba27d4354e1 Mon Sep 17 00:00:00 2001 From: pdenert Date: Fri, 12 Apr 2024 10:36:36 +0200 Subject: [PATCH 44/45] Update changelog --- packages/image_picker/image_picker/CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index d415c1f065e..c9f4b3b43fc 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,8 +1,12 @@ -## 1.0.8 +## 1.1.0 * Adds limit parameter to `MediaOptions` and `MultiImagePickerOptions` which limits the number of media that can be selected. * Currently supported only on iOS and Android. +* Updates minimum supported SDK version to Flutter 3.19/Dart 3.3. + +## 1.0.8 + * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. * Updates support matrix in README to indicate that iOS 11 is no longer supported. * Clients on versions of Flutter that still support iOS 11 can continue to use this From 3f7062e5667dcde5bb68608a0849e83b3a56d1fb Mon Sep 17 00:00:00 2001 From: pdenert Date: Fri, 12 Apr 2024 10:42:37 +0200 Subject: [PATCH 45/45] Update example flutter and dart sdk versions --- packages/image_picker/image_picker/example/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/image_picker/example/pubspec.yaml b/packages/image_picker/image_picker/example/pubspec.yaml index 4b649007aed..b7ca08c9715 100644 --- a/packages/image_picker/image_picker/example/pubspec.yaml +++ b/packages/image_picker/image_picker/example/pubspec.yaml @@ -3,8 +3,8 @@ description: Demonstrates how to use the image_picker plugin. publish_to: none environment: - sdk: ^3.1.0 - flutter: ">=3.13.0" + sdk: ^3.3.0 + flutter: ">=3.19.0" dependencies: flutter: