diff --git a/packages/camera/camera_avfoundation/CHANGELOG.md b/packages/camera/camera_avfoundation/CHANGELOG.md index ca97b101df8b..f760a68fc018 100644 --- a/packages/camera/camera_avfoundation/CHANGELOG.md +++ b/packages/camera/camera_avfoundation/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.10.1+1 + +* Fixes Swift 6 Sendability warning in `CaptureDevice` protocol by annotating + the `setExposureTargetBias` completion handler as `@Sendable`. + ## 0.10.1 * Fixes fatal crash on iPhone 17 when using `ResolutionPreset.max`. diff --git a/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraExposureTests.swift b/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraExposureTests.swift index da5531b652bb..31133fc8080e 100644 --- a/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraExposureTests.swift +++ b/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraExposureTests.swift @@ -124,6 +124,26 @@ final class CameraExposureTests: XCTestCase { XCTAssertTrue(setExposureTargetBiasCalled) } + func testSetExposureTargetBias_completionHandlerIsInvoked() { + // Regression test: the completion handler must be @Sendable to match + // AVCaptureDevice's signature (Swift 6 requirement). + // MockCaptureDevice conforms to CaptureDevice, so a compilation failure + // here means the protocol and mock have diverged. + let (_, mockDevice, _) = createCamera() + + let expectation = expectation(description: "completion handler invoked") + + mockDevice.setExposureTargetBiasStub = { _, handler in + handler?(CMTime(value: 1, timescale: 1)) + } + + mockDevice.setExposureTargetBias(1.0) { _ in + expectation.fulfill() + } + + waitForExpectations(timeout: 1.0) + } + func testMaximumExposureOffset_returnsDeviceMaxExposureTargetBias() { let (camera, mockDevice, _) = createCamera() diff --git a/packages/camera/camera_avfoundation/example/ios/RunnerTests/Mocks/MockCaptureDevice.swift b/packages/camera/camera_avfoundation/example/ios/RunnerTests/Mocks/MockCaptureDevice.swift index 71fe2fc8f7da..312320533729 100644 --- a/packages/camera/camera_avfoundation/example/ios/RunnerTests/Mocks/MockCaptureDevice.swift +++ b/packages/camera/camera_avfoundation/example/ios/RunnerTests/Mocks/MockCaptureDevice.swift @@ -18,7 +18,7 @@ class MockCaptureDevice: NSObject, CaptureDevice { var setFocusPointOfInterestStub: ((CGPoint) -> Void)? var setExposureModeStub: ((AVCaptureDevice.ExposureMode) -> Void)? var setExposurePointOfInterestStub: ((CGPoint) -> Void)? - var setExposureTargetBiasStub: ((Float, ((CMTime) -> Void)?) -> Void)? + var setExposureTargetBiasStub: ((Float, (@Sendable (CMTime) -> Void)?) -> Void)? var isExposureModeSupportedStub: ((AVCaptureDevice.ExposureMode) -> Bool)? var setVideoZoomFactorStub: ((CGFloat) -> Void)? var lockForConfigurationStub: (() throws -> Void)? @@ -99,7 +99,7 @@ class MockCaptureDevice: NSObject, CaptureDevice { set { setExposurePointOfInterestStub?(newValue) } } - func setExposureTargetBias(_ bias: Float, completionHandler handler: ((CMTime) -> Void)? = nil) { + func setExposureTargetBias(_ bias: Float, completionHandler handler: (@Sendable (CMTime) -> Void)? = nil) { setExposureTargetBiasStub?(bias, handler) } diff --git a/packages/camera/camera_avfoundation/ios/camera_avfoundation/Sources/camera_avfoundation/CaptureDevice.swift b/packages/camera/camera_avfoundation/ios/camera_avfoundation/Sources/camera_avfoundation/CaptureDevice.swift index b007cb39b4d1..3e6d15cf89b7 100644 --- a/packages/camera/camera_avfoundation/ios/camera_avfoundation/Sources/camera_avfoundation/CaptureDevice.swift +++ b/packages/camera/camera_avfoundation/ios/camera_avfoundation/Sources/camera_avfoundation/CaptureDevice.swift @@ -45,7 +45,7 @@ protocol CaptureDevice: NSObjectProtocol { var minExposureTargetBias: Float { get } var maxExposureTargetBias: Float { get } func setExposureTargetBias( - _ bias: Float, completionHandler handler: ((CMTime) -> Void)?) + _ bias: Float, completionHandler handler: (@Sendable (CMTime) -> Void)?) func isExposureModeSupported(_ mode: AVCaptureDevice.ExposureMode) -> Bool // Zoom diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index 8a10d0d21f72..8bb81c63faad 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_avfoundation description: iOS implementation of the camera plugin. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_avfoundation issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.10.1 +version: 0.10.1+1 environment: sdk: ^3.9.0