Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


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

* Fixes camera confirmation taps leaking through the picker on some iOS versions (e.g., iOS 26).

## 0.8.13+2

* Updates to Pigeon 26.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -522,7 +522,9 @@ class _MyHomePageState extends State<MyHomePage> {
? int.parse(limitController.text)
: null;
onPick(width, height, quality, limit);
Navigator.of(context).pop();
// Leave the dialog open to verify that tapping the transparent area no longer pops it.
// Regression check for https://github.com/flutter/flutter/issues/173453.
// Navigator.of(context).pop();
},
),
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ @interface FLTImagePickerPlugin ()
/// the array.
@property(strong, nonatomic)
NSMutableArray<UIImagePickerController *> *imagePickerControllerOverrides;
@property(strong, nonatomic) UIWindow *interactionBlockerWindow;
@property(weak, nonatomic) UIWindow *previousKeyWindow;

@end

Expand Down Expand Up @@ -322,6 +324,7 @@ - (void)showCamera:(UIImagePickerControllerCameraDevice)device
[UIImagePickerController isCameraDeviceAvailable:device]) {
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePickerController.cameraDevice = device;
[self addInteractionBlocker];
[[self viewControllerWithWindow:nil] presentViewController:imagePickerController
animated:YES
completion:nil];
Expand Down Expand Up @@ -531,7 +534,10 @@ - (void)picker:(PHPickerViewController *)picker
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary<NSString *, id> *)info {
NSURL *videoURL = info[UIImagePickerControllerMediaURL];
[picker dismissViewControllerAnimated:YES completion:nil];
[picker dismissViewControllerAnimated:YES
completion:^{
[self removeInteractionBlocker];
}];
// The method dismissViewControllerAnimated does not immediately prevent
// further didFinishPickingMediaWithInfo invocations. A nil check is necessary
// to prevent below code to be unwantly executed multiple times and cause a
Expand Down Expand Up @@ -617,7 +623,10 @@ - (void)imagePickerController:(UIImagePickerController *)picker
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissViewControllerAnimated:YES completion:nil];
[picker dismissViewControllerAnimated:YES
completion:^{
[self removeInteractionBlocker];
}];
[self sendCallResultWithSavedPathList:nil];
}

Expand Down Expand Up @@ -673,4 +682,44 @@ - (void)sendCallResultWithError:(FlutterError *)error {
self.callContext = nil;
}

- (void)addInteractionBlocker {
if (self.interactionBlockerWindow != nil) {
return;
}
UIViewController *topController = [self viewControllerWithWindow:nil];
UIWindow *presentingWindow = topController.view.window;
if (!presentingWindow) {
return;
}
self.previousKeyWindow = presentingWindow;
UIWindow *blockerWindow;
if (@available(iOS 13.0, *&&presentingWindow.windowScene)) {
blockerWindow = [[UIWindow alloc] initWithWindowScene:presentingWindow.windowScene];
} else {
blockerWindow = [[UIWindow alloc] initWithFrame:presentingWindow.bounds];
}
blockerWindow.frame = presentingWindow.bounds;
blockerWindow.autoresizingMask =
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
blockerWindow.windowLevel = presentingWindow.windowLevel + 1;
UIViewController *vc = [[UIViewController alloc] init];
vc.view.backgroundColor = [UIColor clearColor];
vc.view.userInteractionEnabled = YES;
blockerWindow.rootViewController = vc;
[blockerWindow makeKeyAndVisible];
self.interactionBlockerWindow = blockerWindow;
}

- (void)removeInteractionBlocker {
if (!self.interactionBlockerWindow) {
return;
}
self.interactionBlockerWindow.hidden = YES;
if (self.previousKeyWindow) {
[self.previousKeyWindow makeKeyWindow];
}
self.interactionBlockerWindow = nil;
self.previousKeyWindow = nil;
}

@end
2 changes: 1 addition & 1 deletion packages/image_picker/image_picker_ios/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: image_picker_ios
description: iOS implementation of the image_picker plugin.
repository: https://github.com/flutter/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.13+2
version: 0.8.13+3

environment:
sdk: ^3.9.0
Expand Down