Skip to content

Conversation

@RobertOdrowaz
Copy link
Contributor

Migrates camera wrappers as part of flutter/flutter#119109

This (last wrappers related 🎉) PR migrates wrappers to Swift:

  • FLTSavePhotoDelegate
  • FLTWritableData
  • FLTImageStreamHandler
  • CameraProperties
  • QueueUtils

In line with Swift conventions, the FLT prefixes are removed.

Pre-Review Checklist

If you need help, consider asking for advice on the #hackers-new channel on Discord.

Note: The Flutter team is currently trialing the use of Gemini Code Assist for GitHub. Comments from the gemini-code-assist bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.

Footnotes

  1. Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. 2 3

// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import AVFoundation
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We used to get AVFoundation and Flutter via camera_avfoundation

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request continues the migration of the camera_avfoundation plugin from Objective-C to Swift, focusing on several wrapper and utility classes like FLTSavePhotoDelegate, FLTWritableData, FLTImageStreamHandler, CameraProperties, and QueueUtils. The migration is well-executed, adhering to Swift conventions by removing the 'FLT' prefixes and adopting modern Swift patterns.

My review includes a few suggestions:

  • A potential bug in SavePhotoDelegate where a nil photo data case is not handled, leading to a false success report.
  • A correction for misleading documentation in SavePhotoDelegate.swift.
  • A recommendation to use preconditionFailure instead of assertionFailure in CameraProperties.swift for a known invalid input to ensure robustness in release builds.

Comment on lines +67 to +69
let data = photoDataProvider()
try data?.write(to: strongSelf.path, options: .atomic)
strongSelf.completionHandler(strongSelf.path, nil)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

There's a potential issue in handlePhotoCaptureResult. If photoDataProvider() returns nil, data?.write(...) does nothing, and no error is thrown. The function then proceeds to call strongSelf.completionHandler(strongSelf.path, nil), incorrectly signaling success even though no file was written. This could lead to problems on the Dart side, which would expect a file at the specified path. You should handle the case where data is nil by reporting an error.

        guard let data = photoDataProvider() else {
          let error = NSError(
            domain: "camera_avfoundation",
            code: 0,
            userInfo: [NSLocalizedDescriptionKey: "Failed to get photo data representation."])
          strongSelf.completionHandler(nil, error)
          return
        }
        try data.write(to: strongSelf.path, options: .atomic)
        strongSelf.completionHandler(strongSelf.path, nil)

FCPGetAVCaptureFlashModeForPigeonFlashMode(FCPPlatformFlashMode.always))

// TODO(FirentisTFW): Migrate implementation to throw Swift error in this case.
let exception = ExceptionCatcher.catchException {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There seems to be now way to test an assertionFailure. getAVCaptureFlashMode could throw a normal exception but then it would require some handling/assertion in the DefaultCamera for case that never actually happens. I don't think this part of the test provides enough value to justify more changes in this PR

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant