[camera]refactor more types into separate files, and add unit tests (#4704)
diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md
index 64b7cfd..dd4042e 100644
--- a/packages/camera/camera/CHANGELOG.md
+++ b/packages/camera/camera/CHANGELOG.md
@@ -1,5 +1,6 @@
## NEXT
+* Minor iOS internal code cleanup related to resolution preset, video format, focus mode, exposure mode and device orientation.
* Minor iOS internal code cleanup related to flash mode.
## 0.9.4+8
diff --git a/packages/camera/camera/example/ios/Runner.xcodeproj/project.pbxproj b/packages/camera/camera/example/ios/Runner.xcodeproj/project.pbxproj
index 87bcf2e..0be5b59 100644
--- a/packages/camera/camera/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/packages/camera/camera/example/ios/Runner.xcodeproj/project.pbxproj
@@ -22,10 +22,10 @@
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
E01EE4A82799F3A5008C1950 /* QueueHelperTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E01EE4A72799F3A5008C1950 /* QueueHelperTests.m */; };
E032F250279F5E94009E9028 /* CameraCaptureSessionQueueRaceConditionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E032F24F279F5E94009E9028 /* CameraCaptureSessionQueueRaceConditionTests.m */; };
- E032F2A727A0BF2D009E9028 /* FLTFlashModeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E032F2A627A0BF2D009E9028 /* FLTFlashModeTests.m */; };
E0C6E2002770F01A00EA6AA3 /* ThreadSafeMethodChannelTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C6E1FD2770F01A00EA6AA3 /* ThreadSafeMethodChannelTests.m */; };
E0C6E2012770F01A00EA6AA3 /* ThreadSafeTextureRegistryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C6E1FE2770F01A00EA6AA3 /* ThreadSafeTextureRegistryTests.m */; };
E0C6E2022770F01A00EA6AA3 /* ThreadSafeEventChannelTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C6E1FF2770F01A00EA6AA3 /* ThreadSafeEventChannelTests.m */; };
+ E0F95E3D27A32AB900699390 /* CameraPropertiesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0F95E3C27A32AB900699390 /* CameraPropertiesTests.m */; };
E487C86026D686A10034AC92 /* CameraPreviewPauseTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E487C85F26D686A10034AC92 /* CameraPreviewPauseTests.m */; };
F6EE622F2710A6FC00905E4A /* MockFLTThreadSafeFlutterResult.m in Sources */ = {isa = PBXBuildFile; fileRef = F6EE622E2710A6FC00905E4A /* MockFLTThreadSafeFlutterResult.m */; };
/* End PBXBuildFile section */
@@ -82,10 +82,10 @@
A24F9E418BA48BCC7409B117 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
E01EE4A72799F3A5008C1950 /* QueueHelperTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QueueHelperTests.m; sourceTree = "<group>"; };
E032F24F279F5E94009E9028 /* CameraCaptureSessionQueueRaceConditionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CameraCaptureSessionQueueRaceConditionTests.m; sourceTree = "<group>"; };
- E032F2A627A0BF2D009E9028 /* FLTFlashModeTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLTFlashModeTests.m; sourceTree = "<group>"; };
E0C6E1FD2770F01A00EA6AA3 /* ThreadSafeMethodChannelTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThreadSafeMethodChannelTests.m; sourceTree = "<group>"; };
E0C6E1FE2770F01A00EA6AA3 /* ThreadSafeTextureRegistryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThreadSafeTextureRegistryTests.m; sourceTree = "<group>"; };
E0C6E1FF2770F01A00EA6AA3 /* ThreadSafeEventChannelTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThreadSafeEventChannelTests.m; sourceTree = "<group>"; };
+ E0F95E3C27A32AB900699390 /* CameraPropertiesTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CameraPropertiesTests.m; sourceTree = "<group>"; };
E487C85F26D686A10034AC92 /* CameraPreviewPauseTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CameraPreviewPauseTests.m; sourceTree = "<group>"; };
F63F9EED27143B19002479BF /* MockFLTThreadSafeFlutterResult.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockFLTThreadSafeFlutterResult.h; sourceTree = "<group>"; };
F6EE622E2710A6FC00905E4A /* MockFLTThreadSafeFlutterResult.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockFLTThreadSafeFlutterResult.m; sourceTree = "<group>"; };
@@ -127,7 +127,7 @@
F6EE622E2710A6FC00905E4A /* MockFLTThreadSafeFlutterResult.m */,
F63F9EED27143B19002479BF /* MockFLTThreadSafeFlutterResult.h */,
E032F24F279F5E94009E9028 /* CameraCaptureSessionQueueRaceConditionTests.m */,
- E032F2A627A0BF2D009E9028 /* FLTFlashModeTests.m */,
+ E0F95E3C27A32AB900699390 /* CameraPropertiesTests.m */,
);
path = RunnerTests;
sourceTree = "<group>";
@@ -391,8 +391,8 @@
buildActionMask = 2147483647;
files = (
03F6F8B226CBB4670024B8D3 /* ThreadSafeFlutterResultTests.m in Sources */,
- E032F2A727A0BF2D009E9028 /* FLTFlashModeTests.m in Sources */,
033B94BE269C40A200B4DF97 /* CameraMethodChannelTests.m in Sources */,
+ E0F95E3D27A32AB900699390 /* CameraPropertiesTests.m in Sources */,
03BB766B2665316900CE5A93 /* CameraFocusTests.m in Sources */,
E487C86026D686A10034AC92 /* CameraPreviewPauseTests.m in Sources */,
F6EE622F2710A6FC00905E4A /* MockFLTThreadSafeFlutterResult.m in Sources */,
diff --git a/packages/camera/camera/example/ios/RunnerTests/CameraPropertiesTests.m b/packages/camera/camera/example/ios/RunnerTests/CameraPropertiesTests.m
new file mode 100644
index 0000000..8657915
--- /dev/null
+++ b/packages/camera/camera/example/ios/RunnerTests/CameraPropertiesTests.m
@@ -0,0 +1,107 @@
+// 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.
+
+@import camera.Test;
+@import AVFoundation;
+@import XCTest;
+
+@interface CameraPropertiesTests : XCTestCase
+
+@end
+
+@implementation CameraPropertiesTests
+
+#pragma mark - flash mode tests
+
+- (void)testFLTGetFLTFlashModeForString {
+ XCTAssertEqual(FLTFlashModeOff, FLTGetFLTFlashModeForString(@"off"));
+ XCTAssertEqual(FLTFlashModeAuto, FLTGetFLTFlashModeForString(@"auto"));
+ XCTAssertEqual(FLTFlashModeAlways, FLTGetFLTFlashModeForString(@"always"));
+ XCTAssertEqual(FLTFlashModeTorch, FLTGetFLTFlashModeForString(@"torch"));
+ XCTAssertThrows(FLTGetFLTFlashModeForString(@"unkwown"));
+}
+
+- (void)testFLTGetAVCaptureFlashModeForFLTFlashMode {
+ XCTAssertEqual(AVCaptureFlashModeOff, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeOff));
+ XCTAssertEqual(AVCaptureFlashModeAuto, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeAuto));
+ XCTAssertEqual(AVCaptureFlashModeOn, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeAlways));
+ XCTAssertEqual(-1, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeTorch));
+}
+
+#pragma mark - exposure mode tests
+
+- (void)testFLTGetStringForFLTExposureMode {
+ XCTAssertEqualObjects(@"auto", FLTGetStringForFLTExposureMode(FLTExposureModeAuto));
+ XCTAssertEqualObjects(@"locked", FLTGetStringForFLTExposureMode(FLTExposureModeLocked));
+ XCTAssertThrows(FLTGetStringForFLTExposureMode(-1));
+}
+
+- (void)testFLTGetFLTExposureModeForString {
+ XCTAssertEqual(FLTExposureModeAuto, FLTGetFLTExposureModeForString(@"auto"));
+ XCTAssertEqual(FLTExposureModeLocked, FLTGetFLTExposureModeForString(@"locked"));
+ XCTAssertThrows(FLTGetFLTExposureModeForString(@"unknown"));
+}
+
+#pragma mark - focus mode tests
+
+- (void)testFLTGetStringForFLTFocusMode {
+ XCTAssertEqualObjects(@"auto", FLTGetStringForFLTFocusMode(FLTFocusModeAuto));
+ XCTAssertEqualObjects(@"locked", FLTGetStringForFLTFocusMode(FLTFocusModeLocked));
+ XCTAssertThrows(FLTGetStringForFLTFocusMode(-1));
+}
+
+- (void)testFLTGetFLTFocusModeForString {
+ XCTAssertEqual(FLTFocusModeAuto, FLTGetFLTFocusModeForString(@"auto"));
+ XCTAssertEqual(FLTFocusModeLocked, FLTGetFLTFocusModeForString(@"locked"));
+ XCTAssertThrows(FLTGetFLTFocusModeForString(@"unknown"));
+}
+
+#pragma mark - resolution preset tests
+
+- (void)testFLTGetFLTResolutionPresetForString {
+ XCTAssertEqual(FLTResolutionPresetVeryLow, FLTGetFLTResolutionPresetForString(@"veryLow"));
+ XCTAssertEqual(FLTResolutionPresetLow, FLTGetFLTResolutionPresetForString(@"low"));
+ XCTAssertEqual(FLTResolutionPresetMedium, FLTGetFLTResolutionPresetForString(@"medium"));
+ XCTAssertEqual(FLTResolutionPresetHigh, FLTGetFLTResolutionPresetForString(@"high"));
+ XCTAssertEqual(FLTResolutionPresetVeryHigh, FLTGetFLTResolutionPresetForString(@"veryHigh"));
+ XCTAssertEqual(FLTResolutionPresetUltraHigh, FLTGetFLTResolutionPresetForString(@"ultraHigh"));
+ XCTAssertEqual(FLTResolutionPresetMax, FLTGetFLTResolutionPresetForString(@"max"));
+ XCTAssertThrows(FLTGetFLTFlashModeForString(@"unknown"));
+}
+
+#pragma mark - video format tests
+
+- (void)testFLTGetVideoFormatFromString {
+ XCTAssertEqual(kCVPixelFormatType_32BGRA, FLTGetVideoFormatFromString(@"bgra8888"));
+ XCTAssertEqual(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
+ FLTGetVideoFormatFromString(@"yuv420"));
+ XCTAssertEqual(kCVPixelFormatType_32BGRA, FLTGetVideoFormatFromString(@"unknown"));
+}
+
+#pragma mark - device orientation tests
+
+- (void)testFLTGetUIDeviceOrientationForString {
+ XCTAssertEqual(UIDeviceOrientationPortraitUpsideDown,
+ FLTGetUIDeviceOrientationForString(@"portraitDown"));
+ XCTAssertEqual(UIDeviceOrientationLandscapeRight,
+ FLTGetUIDeviceOrientationForString(@"landscapeLeft"));
+ XCTAssertEqual(UIDeviceOrientationLandscapeLeft,
+ FLTGetUIDeviceOrientationForString(@"landscapeRight"));
+ XCTAssertEqual(UIDeviceOrientationPortrait, FLTGetUIDeviceOrientationForString(@"portraitUp"));
+ XCTAssertThrows(FLTGetUIDeviceOrientationForString(@"unknown"));
+}
+
+- (void)testFLTGetStringForUIDeviceOrientation {
+ XCTAssertEqualObjects(@"portraitDown",
+ FLTGetStringForUIDeviceOrientation(UIDeviceOrientationPortraitUpsideDown));
+ XCTAssertEqualObjects(@"landscapeLeft",
+ FLTGetStringForUIDeviceOrientation(UIDeviceOrientationLandscapeRight));
+ XCTAssertEqualObjects(@"landscapeRight",
+ FLTGetStringForUIDeviceOrientation(UIDeviceOrientationLandscapeLeft));
+ XCTAssertEqualObjects(@"portraitUp",
+ FLTGetStringForUIDeviceOrientation(UIDeviceOrientationPortrait));
+ XCTAssertEqualObjects(@"portraitUp", FLTGetStringForUIDeviceOrientation(-1));
+}
+
+@end
diff --git a/packages/camera/camera/example/ios/RunnerTests/FLTFlashModeTests.m b/packages/camera/camera/example/ios/RunnerTests/FLTFlashModeTests.m
deleted file mode 100644
index b38b7eb..0000000
--- a/packages/camera/camera/example/ios/RunnerTests/FLTFlashModeTests.m
+++ /dev/null
@@ -1,30 +0,0 @@
-// 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.
-
-@import camera.Test;
-@import AVFoundation;
-#import <XCTest/XCTest.h>
-
-@interface FLTFlashModeTests : XCTestCase
-
-@end
-
-@implementation FLTFlashModeTests
-
-- (void)testFLTGetFLTFlashModeForString {
- XCTAssertEqual(FLTFlashModeOff, FLTGetFLTFlashModeForString(@"off"));
- XCTAssertEqual(FLTFlashModeAuto, FLTGetFLTFlashModeForString(@"auto"));
- XCTAssertEqual(FLTFlashModeAlways, FLTGetFLTFlashModeForString(@"always"));
- XCTAssertEqual(FLTFlashModeTorch, FLTGetFLTFlashModeForString(@"torch"));
- XCTAssertThrows(FLTGetFLTFlashModeForString(@"unkwown"));
-}
-
-- (void)testFLTGetAVCaptureFlashModeForFLTFlashMode {
- XCTAssertEqual(AVCaptureFlashModeOff, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeOff));
- XCTAssertEqual(AVCaptureFlashModeAuto, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeAuto));
- XCTAssertEqual(AVCaptureFlashModeOn, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeAlways));
- XCTAssertEqual(-1, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeTorch));
-}
-
-@end
diff --git a/packages/camera/camera/ios/Classes/CameraPlugin.m b/packages/camera/camera/ios/Classes/CameraPlugin.m
index be5ba80..ae55188 100644
--- a/packages/camera/camera/ios/Classes/CameraPlugin.m
+++ b/packages/camera/camera/ios/Classes/CameraPlugin.m
@@ -10,11 +10,11 @@
#import <CoreMotion/CoreMotion.h>
#import <libkern/OSAtomic.h>
#import <uuid/uuid.h>
+#import "CameraProperties.h"
#import "FLTThreadSafeEventChannel.h"
#import "FLTThreadSafeFlutterResult.h"
#import "FLTThreadSafeMethodChannel.h"
#import "FLTThreadSafeTextureRegistry.h"
-#import "FlashMode.h"
@interface FLTSavePhotoDelegate : NSObject <AVCapturePhotoCaptureDelegate>
@property(readonly, nonatomic) NSString *path;
@@ -114,167 +114,6 @@
}
@end
-static OSType getVideoFormatFromString(NSString *videoFormatString) {
- if ([videoFormatString isEqualToString:@"bgra8888"]) {
- return kCVPixelFormatType_32BGRA;
- } else if ([videoFormatString isEqualToString:@"yuv420"]) {
- return kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
- } else {
- NSLog(@"The selected imageFormatGroup is not supported by iOS. Defaulting to brga8888");
- return kCVPixelFormatType_32BGRA;
- }
-}
-
-// Mirrors ExposureMode in camera.dart
-typedef enum {
- ExposureModeAuto,
- ExposureModeLocked,
-
-} ExposureMode;
-
-static NSString *getStringForExposureMode(ExposureMode mode) {
- switch (mode) {
- case ExposureModeAuto:
- return @"auto";
- case ExposureModeLocked:
- return @"locked";
- }
- NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
- code:NSURLErrorUnknown
- userInfo:@{
- NSLocalizedDescriptionKey : [NSString
- stringWithFormat:@"Unknown string for exposure mode"]
- }];
- @throw error;
-}
-
-static ExposureMode getExposureModeForString(NSString *mode) {
- if ([mode isEqualToString:@"auto"]) {
- return ExposureModeAuto;
- } else if ([mode isEqualToString:@"locked"]) {
- return ExposureModeLocked;
- } else {
- NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
- code:NSURLErrorUnknown
- userInfo:@{
- NSLocalizedDescriptionKey : [NSString
- stringWithFormat:@"Unknown exposure mode %@", mode]
- }];
- @throw error;
- }
-}
-
-static UIDeviceOrientation getUIDeviceOrientationForString(NSString *orientation) {
- if ([orientation isEqualToString:@"portraitDown"]) {
- return UIDeviceOrientationPortraitUpsideDown;
- } else if ([orientation isEqualToString:@"landscapeLeft"]) {
- return UIDeviceOrientationLandscapeRight;
- } else if ([orientation isEqualToString:@"landscapeRight"]) {
- return UIDeviceOrientationLandscapeLeft;
- } else if ([orientation isEqualToString:@"portraitUp"]) {
- return UIDeviceOrientationPortrait;
- } else {
- NSError *error = [NSError
- errorWithDomain:NSCocoaErrorDomain
- code:NSURLErrorUnknown
- userInfo:@{
- NSLocalizedDescriptionKey :
- [NSString stringWithFormat:@"Unknown device orientation %@", orientation]
- }];
- @throw error;
- }
-}
-
-static NSString *getStringForUIDeviceOrientation(UIDeviceOrientation orientation) {
- switch (orientation) {
- case UIDeviceOrientationPortraitUpsideDown:
- return @"portraitDown";
- case UIDeviceOrientationLandscapeRight:
- return @"landscapeLeft";
- case UIDeviceOrientationLandscapeLeft:
- return @"landscapeRight";
- case UIDeviceOrientationPortrait:
- default:
- return @"portraitUp";
- break;
- };
-}
-
-// Mirrors FocusMode in camera.dart
-typedef enum {
- FocusModeAuto,
- FocusModeLocked,
-} FocusMode;
-
-static NSString *getStringForFocusMode(FocusMode mode) {
- switch (mode) {
- case FocusModeAuto:
- return @"auto";
- case FocusModeLocked:
- return @"locked";
- }
- NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
- code:NSURLErrorUnknown
- userInfo:@{
- NSLocalizedDescriptionKey : [NSString
- stringWithFormat:@"Unknown string for focus mode"]
- }];
- @throw error;
-}
-
-static FocusMode getFocusModeForString(NSString *mode) {
- if ([mode isEqualToString:@"auto"]) {
- return FocusModeAuto;
- } else if ([mode isEqualToString:@"locked"]) {
- return FocusModeLocked;
- } else {
- NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
- code:NSURLErrorUnknown
- userInfo:@{
- NSLocalizedDescriptionKey : [NSString
- stringWithFormat:@"Unknown focus mode %@", mode]
- }];
- @throw error;
- }
-}
-
-// Mirrors ResolutionPreset in camera.dart
-typedef enum {
- veryLow,
- low,
- medium,
- high,
- veryHigh,
- ultraHigh,
- max,
-} ResolutionPreset;
-
-static ResolutionPreset getResolutionPresetForString(NSString *preset) {
- if ([preset isEqualToString:@"veryLow"]) {
- return veryLow;
- } else if ([preset isEqualToString:@"low"]) {
- return low;
- } else if ([preset isEqualToString:@"medium"]) {
- return medium;
- } else if ([preset isEqualToString:@"high"]) {
- return high;
- } else if ([preset isEqualToString:@"veryHigh"]) {
- return veryHigh;
- } else if ([preset isEqualToString:@"ultraHigh"]) {
- return ultraHigh;
- } else if ([preset isEqualToString:@"max"]) {
- return max;
- } else {
- NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
- code:NSURLErrorUnknown
- userInfo:@{
- NSLocalizedDescriptionKey : [NSString
- stringWithFormat:@"Unknown resolution preset %@", preset]
- }];
- @throw error;
- }
-}
-
@interface FLTCam : NSObject <FlutterTexture,
AVCaptureVideoDataOutputSampleBufferDelegate,
AVCaptureAudioDataOutputSampleBufferDelegate>
@@ -305,9 +144,9 @@
@property(assign, nonatomic) BOOL isAudioSetup;
@property(assign, nonatomic) BOOL isStreamingImages;
@property(assign, nonatomic) BOOL isPreviewPaused;
-@property(assign, nonatomic) ResolutionPreset resolutionPreset;
-@property(assign, nonatomic) ExposureMode exposureMode;
-@property(assign, nonatomic) FocusMode focusMode;
+@property(assign, nonatomic) FLTResolutionPreset resolutionPreset;
+@property(assign, nonatomic) FLTExposureMode exposureMode;
+@property(assign, nonatomic) FLTFocusMode focusMode;
@property(assign, nonatomic) FLTFlashMode flashMode;
@property(assign, nonatomic) UIDeviceOrientation lockedCaptureOrientation;
@property(assign, nonatomic) CMTime lastVideoSampleTime;
@@ -337,7 +176,7 @@
self = [super init];
NSAssert(self, @"super init cannot be nil");
@try {
- _resolutionPreset = getResolutionPresetForString(resolutionPreset);
+ _resolutionPreset = FLTGetFLTResolutionPresetForString(resolutionPreset);
} @catch (NSError *e) {
*error = e;
}
@@ -346,8 +185,8 @@
_captureSession = [[AVCaptureSession alloc] init];
_captureDevice = [AVCaptureDevice deviceWithUniqueID:cameraName];
_flashMode = _captureDevice.hasFlash ? FLTFlashModeAuto : FLTFlashModeOff;
- _exposureMode = ExposureModeAuto;
- _focusMode = FocusModeAuto;
+ _exposureMode = FLTExposureModeAuto;
+ _focusMode = FLTFocusModeAuto;
_lockedCaptureOrientation = UIDeviceOrientationUnknown;
_deviceOrientation = orientation;
_videoFormat = kCVPixelFormatType_32BGRA;
@@ -443,7 +282,7 @@
- (void)captureToFile:(FLTThreadSafeFlutterResult *)result API_AVAILABLE(ios(10)) {
AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings];
- if (_resolutionPreset == max) {
+ if (_resolutionPreset == FLTResolutionPresetMax) {
[settings setHighResolutionPhotoEnabled:YES];
}
@@ -511,10 +350,10 @@
return file;
}
-- (void)setCaptureSessionPreset:(ResolutionPreset)resolutionPreset {
+- (void)setCaptureSessionPreset:(FLTResolutionPreset)resolutionPreset {
switch (resolutionPreset) {
- case max:
- case ultraHigh:
+ case FLTResolutionPresetMax:
+ case FLTResolutionPresetUltraHigh:
if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset3840x2160]) {
_captureSession.sessionPreset = AVCaptureSessionPreset3840x2160;
_previewSize = CGSizeMake(3840, 2160);
@@ -527,25 +366,25 @@
_captureDevice.activeFormat.highResolutionStillImageDimensions.height);
break;
}
- case veryHigh:
+ case FLTResolutionPresetVeryHigh:
if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset1920x1080]) {
_captureSession.sessionPreset = AVCaptureSessionPreset1920x1080;
_previewSize = CGSizeMake(1920, 1080);
break;
}
- case high:
+ case FLTResolutionPresetHigh:
if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset1280x720]) {
_captureSession.sessionPreset = AVCaptureSessionPreset1280x720;
_previewSize = CGSizeMake(1280, 720);
break;
}
- case medium:
+ case FLTResolutionPresetMedium:
if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset640x480]) {
_captureSession.sessionPreset = AVCaptureSessionPreset640x480;
_previewSize = CGSizeMake(640, 480);
break;
}
- case low:
+ case FLTResolutionPresetLow:
if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset352x288]) {
_captureSession.sessionPreset = AVCaptureSessionPreset352x288;
_previewSize = CGSizeMake(352, 288);
@@ -871,7 +710,7 @@
orientation:(NSString *)orientationStr {
UIDeviceOrientation orientation;
@try {
- orientation = getUIDeviceOrientationForString(orientationStr);
+ orientation = FLTGetUIDeviceOrientationForString(orientationStr);
} @catch (NSError *e) {
[result sendError:e];
return;
@@ -943,9 +782,9 @@
}
- (void)setExposureModeWithResult:(FLTThreadSafeFlutterResult *)result mode:(NSString *)modeStr {
- ExposureMode mode;
+ FLTExposureMode mode;
@try {
- mode = getExposureModeForString(modeStr);
+ mode = FLTGetFLTExposureModeForString(modeStr);
} @catch (NSError *e) {
[result sendError:e];
return;
@@ -958,10 +797,10 @@
- (void)applyExposureMode {
[_captureDevice lockForConfiguration:nil];
switch (_exposureMode) {
- case ExposureModeLocked:
+ case FLTExposureModeLocked:
[_captureDevice setExposureMode:AVCaptureExposureModeAutoExpose];
break;
- case ExposureModeAuto:
+ case FLTExposureModeAuto:
if ([_captureDevice isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]) {
[_captureDevice setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
} else {
@@ -973,9 +812,9 @@
}
- (void)setFocusModeWithResult:(FLTThreadSafeFlutterResult *)result mode:(NSString *)modeStr {
- FocusMode mode;
+ FLTFocusMode mode;
@try {
- mode = getFocusModeForString(modeStr);
+ mode = FLTGetFLTFocusModeForString(modeStr);
} @catch (NSError *e) {
[result sendError:e];
return;
@@ -1003,15 +842,15 @@
* @param focusMode The focus mode that should be applied to the @captureDevice instance.
* @param captureDevice The AVCaptureDevice to which the @focusMode will be applied.
*/
-- (void)applyFocusMode:(FocusMode)focusMode onDevice:(AVCaptureDevice *)captureDevice {
+- (void)applyFocusMode:(FLTFocusMode)focusMode onDevice:(AVCaptureDevice *)captureDevice {
[captureDevice lockForConfiguration:nil];
switch (focusMode) {
- case FocusModeLocked:
+ case FLTFocusModeLocked:
if ([captureDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {
[captureDevice setFocusMode:AVCaptureFocusModeAutoFocus];
}
break;
- case FocusModeAuto:
+ case FLTFocusModeAuto:
if ([captureDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]) {
[captureDevice setFocusMode:AVCaptureFocusModeContinuousAutoFocus];
} else if ([captureDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {
@@ -1346,7 +1185,7 @@
- (void)sendDeviceOrientation:(UIDeviceOrientation)orientation {
[_deviceEventMethodChannel
invokeMethod:@"orientation_changed"
- arguments:@{@"orientation" : getStringForUIDeviceOrientation(orientation)}];
+ arguments:@{@"orientation" : FLTGetStringForUIDeviceOrientation(orientation)}];
}
- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result {
@@ -1430,7 +1269,7 @@
NSUInteger cameraId = ((NSNumber *)argsMap[@"cameraId"]).unsignedIntegerValue;
if ([@"initialize" isEqualToString:call.method]) {
NSString *videoFormatValue = ((NSString *)argsMap[@"imageFormatGroup"]);
- [_camera setVideoFormat:getVideoFormatFromString(videoFormatValue)];
+ [_camera setVideoFormat:FLTGetVideoFormatFromString(videoFormatValue)];
__weak CameraPlugin *weakSelf = self;
_camera.onFrameAvailable = ^{
@@ -1450,8 +1289,8 @@
arguments:@{
@"previewWidth" : @(_camera.previewSize.width),
@"previewHeight" : @(_camera.previewSize.height),
- @"exposureMode" : getStringForExposureMode([_camera exposureMode]),
- @"focusMode" : getStringForFocusMode([_camera focusMode]),
+ @"exposureMode" : FLTGetStringForFLTExposureMode([_camera exposureMode]),
+ @"focusMode" : FLTGetStringForFLTFocusMode([_camera focusMode]),
@"exposurePointSupported" :
@([_camera.captureDevice isExposurePointOfInterestSupported]),
@"focusPointSupported" : @([_camera.captureDevice isFocusPointOfInterestSupported]),
diff --git a/packages/camera/camera/ios/Classes/CameraPlugin.modulemap b/packages/camera/camera/ios/Classes/CameraPlugin.modulemap
index 8baa71b..0593741 100644
--- a/packages/camera/camera/ios/Classes/CameraPlugin.modulemap
+++ b/packages/camera/camera/ios/Classes/CameraPlugin.modulemap
@@ -6,6 +6,6 @@
explicit module Test {
header "CameraPlugin_Test.h"
- header "FlashMode.h"
+ header "CameraProperties.h"
}
}
diff --git a/packages/camera/camera/ios/Classes/CameraProperties.h b/packages/camera/camera/ios/Classes/CameraProperties.h
new file mode 100644
index 0000000..aee4d64
--- /dev/null
+++ b/packages/camera/camera/ios/Classes/CameraProperties.h
@@ -0,0 +1,118 @@
+// 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.
+
+@import AVFoundation;
+@import Foundation;
+
+NS_ASSUME_NONNULL_BEGIN
+
+#pragma mark - flash mode
+
+/**
+ * Represents camera's flash mode. Mirrors `FlashMode` enum in flash_mode.dart.
+ */
+typedef NS_ENUM(NSInteger, FLTFlashMode) {
+ FLTFlashModeOff,
+ FLTFlashModeAuto,
+ FLTFlashModeAlways,
+ FLTFlashModeTorch,
+};
+
+/**
+ * Gets FLTFlashMode from its string representation.
+ * @param mode a string representation of the FLTFlashMode.
+ */
+extern FLTFlashMode FLTGetFLTFlashModeForString(NSString *mode);
+
+/**
+ * Gets AVCaptureFlashMode from FLTFlashMode.
+ * @param mode flash mode.
+ */
+extern AVCaptureFlashMode FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashMode mode);
+
+#pragma mark - exposure mode
+
+/**
+ * Represents camera's exposure mode. Mirrors ExposureMode in camera.dart.
+ */
+typedef NS_ENUM(NSInteger, FLTExposureMode) {
+ FLTExposureModeAuto,
+ FLTExposureModeLocked,
+};
+
+/**
+ * Gets a string representation of exposure mode.
+ * @param mode exposure mode
+ */
+extern NSString *FLTGetStringForFLTExposureMode(FLTExposureMode mode);
+
+/**
+ * Gets FLTExposureMode from its string representation.
+ * @param mode a string representation of the FLTExposureMode.
+ */
+extern FLTExposureMode FLTGetFLTExposureModeForString(NSString *mode);
+
+#pragma mark - focus mode
+
+/**
+ * Represents camera's focus mode. Mirrors FocusMode in camera.dart.
+ */
+typedef NS_ENUM(NSInteger, FLTFocusMode) {
+ FLTFocusModeAuto,
+ FLTFocusModeLocked,
+};
+
+/**
+ * Gets a string representation from FLTFocusMode.
+ * @param mode focus mode
+ */
+extern NSString *FLTGetStringForFLTFocusMode(FLTFocusMode mode);
+
+/**
+ * Gets FLTFocusMode from its string representation.
+ * @param mode a string representation of focus mode.
+ */
+extern FLTFocusMode FLTGetFLTFocusModeForString(NSString *mode);
+
+#pragma mark - device orientation
+
+/**
+ * Gets UIDeviceOrientation from its string representation.
+ */
+extern UIDeviceOrientation FLTGetUIDeviceOrientationForString(NSString *orientation);
+
+/**
+ * Gets a string representation of UIDeviceOrientation.
+ */
+extern NSString *FLTGetStringForUIDeviceOrientation(UIDeviceOrientation orientation);
+
+#pragma mark - resolution preset
+
+/**
+ * Represents camera's resolution present. Mirrors ResolutionPreset in camera.dart.
+ */
+typedef NS_ENUM(NSInteger, FLTResolutionPreset) {
+ FLTResolutionPresetVeryLow,
+ FLTResolutionPresetLow,
+ FLTResolutionPresetMedium,
+ FLTResolutionPresetHigh,
+ FLTResolutionPresetVeryHigh,
+ FLTResolutionPresetUltraHigh,
+ FLTResolutionPresetMax,
+};
+
+/**
+ * Gets FLTResolutionPreset from its string representation.
+ * @param preset a string representation of FLTResolutionPreset.
+ */
+extern FLTResolutionPreset FLTGetFLTResolutionPresetForString(NSString *preset);
+
+#pragma mark - video format
+
+/**
+ * Gets VideoFormat from its string representation.
+ */
+extern OSType FLTGetVideoFormatFromString(NSString *videoFormatString);
+
+NS_ASSUME_NONNULL_END
diff --git a/packages/camera/camera/ios/Classes/CameraProperties.m b/packages/camera/camera/ios/Classes/CameraProperties.m
new file mode 100644
index 0000000..e36f98a
--- /dev/null
+++ b/packages/camera/camera/ios/Classes/CameraProperties.m
@@ -0,0 +1,187 @@
+// 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.
+
+#import "CameraProperties.h"
+
+#pragma mark - flash mode
+
+FLTFlashMode FLTGetFLTFlashModeForString(NSString *mode) {
+ if ([mode isEqualToString:@"off"]) {
+ return FLTFlashModeOff;
+ } else if ([mode isEqualToString:@"auto"]) {
+ return FLTFlashModeAuto;
+ } else if ([mode isEqualToString:@"always"]) {
+ return FLTFlashModeAlways;
+ } else if ([mode isEqualToString:@"torch"]) {
+ return FLTFlashModeTorch;
+ } else {
+ NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+ code:NSURLErrorUnknown
+ userInfo:@{
+ NSLocalizedDescriptionKey : [NSString
+ stringWithFormat:@"Unknown flash mode %@", mode]
+ }];
+ @throw error;
+ }
+}
+
+AVCaptureFlashMode FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashMode mode) {
+ switch (mode) {
+ case FLTFlashModeOff:
+ return AVCaptureFlashModeOff;
+ case FLTFlashModeAuto:
+ return AVCaptureFlashModeAuto;
+ case FLTFlashModeAlways:
+ return AVCaptureFlashModeOn;
+ case FLTFlashModeTorch:
+ default:
+ return -1;
+ }
+}
+
+#pragma mark - exposure mode
+
+NSString *FLTGetStringForFLTExposureMode(FLTExposureMode mode) {
+ switch (mode) {
+ case FLTExposureModeAuto:
+ return @"auto";
+ case FLTExposureModeLocked:
+ return @"locked";
+ }
+ NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+ code:NSURLErrorUnknown
+ userInfo:@{
+ NSLocalizedDescriptionKey : [NSString
+ stringWithFormat:@"Unknown string for exposure mode"]
+ }];
+ @throw error;
+}
+
+FLTExposureMode FLTGetFLTExposureModeForString(NSString *mode) {
+ if ([mode isEqualToString:@"auto"]) {
+ return FLTExposureModeAuto;
+ } else if ([mode isEqualToString:@"locked"]) {
+ return FLTExposureModeLocked;
+ } else {
+ NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+ code:NSURLErrorUnknown
+ userInfo:@{
+ NSLocalizedDescriptionKey : [NSString
+ stringWithFormat:@"Unknown exposure mode %@", mode]
+ }];
+ @throw error;
+ }
+}
+
+#pragma mark - focus mode
+
+NSString *FLTGetStringForFLTFocusMode(FLTFocusMode mode) {
+ switch (mode) {
+ case FLTFocusModeAuto:
+ return @"auto";
+ case FLTFocusModeLocked:
+ return @"locked";
+ }
+ NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+ code:NSURLErrorUnknown
+ userInfo:@{
+ NSLocalizedDescriptionKey : [NSString
+ stringWithFormat:@"Unknown string for focus mode"]
+ }];
+ @throw error;
+}
+
+FLTFocusMode FLTGetFLTFocusModeForString(NSString *mode) {
+ if ([mode isEqualToString:@"auto"]) {
+ return FLTFocusModeAuto;
+ } else if ([mode isEqualToString:@"locked"]) {
+ return FLTFocusModeLocked;
+ } else {
+ NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+ code:NSURLErrorUnknown
+ userInfo:@{
+ NSLocalizedDescriptionKey : [NSString
+ stringWithFormat:@"Unknown focus mode %@", mode]
+ }];
+ @throw error;
+ }
+}
+
+#pragma mark - device orientation
+
+UIDeviceOrientation FLTGetUIDeviceOrientationForString(NSString *orientation) {
+ if ([orientation isEqualToString:@"portraitDown"]) {
+ return UIDeviceOrientationPortraitUpsideDown;
+ } else if ([orientation isEqualToString:@"landscapeLeft"]) {
+ return UIDeviceOrientationLandscapeRight;
+ } else if ([orientation isEqualToString:@"landscapeRight"]) {
+ return UIDeviceOrientationLandscapeLeft;
+ } else if ([orientation isEqualToString:@"portraitUp"]) {
+ return UIDeviceOrientationPortrait;
+ } else {
+ NSError *error = [NSError
+ errorWithDomain:NSCocoaErrorDomain
+ code:NSURLErrorUnknown
+ userInfo:@{
+ NSLocalizedDescriptionKey :
+ [NSString stringWithFormat:@"Unknown device orientation %@", orientation]
+ }];
+ @throw error;
+ }
+}
+
+NSString *FLTGetStringForUIDeviceOrientation(UIDeviceOrientation orientation) {
+ switch (orientation) {
+ case UIDeviceOrientationPortraitUpsideDown:
+ return @"portraitDown";
+ case UIDeviceOrientationLandscapeRight:
+ return @"landscapeLeft";
+ case UIDeviceOrientationLandscapeLeft:
+ return @"landscapeRight";
+ case UIDeviceOrientationPortrait:
+ default:
+ return @"portraitUp";
+ };
+}
+
+#pragma mark - resolution preset
+
+FLTResolutionPreset FLTGetFLTResolutionPresetForString(NSString *preset) {
+ if ([preset isEqualToString:@"veryLow"]) {
+ return FLTResolutionPresetVeryLow;
+ } else if ([preset isEqualToString:@"low"]) {
+ return FLTResolutionPresetLow;
+ } else if ([preset isEqualToString:@"medium"]) {
+ return FLTResolutionPresetMedium;
+ } else if ([preset isEqualToString:@"high"]) {
+ return FLTResolutionPresetHigh;
+ } else if ([preset isEqualToString:@"veryHigh"]) {
+ return FLTResolutionPresetVeryHigh;
+ } else if ([preset isEqualToString:@"ultraHigh"]) {
+ return FLTResolutionPresetUltraHigh;
+ } else if ([preset isEqualToString:@"max"]) {
+ return FLTResolutionPresetMax;
+ } else {
+ NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+ code:NSURLErrorUnknown
+ userInfo:@{
+ NSLocalizedDescriptionKey : [NSString
+ stringWithFormat:@"Unknown resolution preset %@", preset]
+ }];
+ @throw error;
+ }
+}
+
+#pragma mark - video format
+
+OSType FLTGetVideoFormatFromString(NSString *videoFormatString) {
+ if ([videoFormatString isEqualToString:@"bgra8888"]) {
+ return kCVPixelFormatType_32BGRA;
+ } else if ([videoFormatString isEqualToString:@"yuv420"]) {
+ return kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
+ } else {
+ NSLog(@"The selected imageFormatGroup is not supported by iOS. Defaulting to brga8888");
+ return kCVPixelFormatType_32BGRA;
+ }
+}
diff --git a/packages/camera/camera/ios/Classes/FlashMode.h b/packages/camera/camera/ios/Classes/FlashMode.h
deleted file mode 100644
index b04496d..0000000
--- a/packages/camera/camera/ios/Classes/FlashMode.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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.
-
-#import <AVFoundation/AVFoundation.h>
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * Represents camera's flash mode. Mirrors `FlashMode` enum in flash_mode.dart.
- */
-typedef NS_ENUM(NSInteger, FLTFlashMode) {
- FLTFlashModeOff,
- FLTFlashModeAuto,
- FLTFlashModeAlways,
- FLTFlashModeTorch,
-};
-
-/**
- * Gets FLTFlashMode from its string representation.
- * @param mode a string representation of the FLTFlashMode.
- */
-extern FLTFlashMode FLTGetFLTFlashModeForString(NSString *mode);
-
-/**
- * Gets AVCaptureFlashMode from FLTFlashMode.
- * @param mode flash mode.
- */
-extern AVCaptureFlashMode FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashMode mode);
-
-NS_ASSUME_NONNULL_END
diff --git a/packages/camera/camera/ios/Classes/FlashMode.m b/packages/camera/camera/ios/Classes/FlashMode.m
deleted file mode 100644
index b9d4a4a..0000000
--- a/packages/camera/camera/ios/Classes/FlashMode.m
+++ /dev/null
@@ -1,39 +0,0 @@
-// 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.
-
-#import "FlashMode.h"
-
-FLTFlashMode FLTGetFLTFlashModeForString(NSString *mode) {
- if ([mode isEqualToString:@"off"]) {
- return FLTFlashModeOff;
- } else if ([mode isEqualToString:@"auto"]) {
- return FLTFlashModeAuto;
- } else if ([mode isEqualToString:@"always"]) {
- return FLTFlashModeAlways;
- } else if ([mode isEqualToString:@"torch"]) {
- return FLTFlashModeTorch;
- } else {
- NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
- code:NSURLErrorUnknown
- userInfo:@{
- NSLocalizedDescriptionKey : [NSString
- stringWithFormat:@"Unknown flash mode %@", mode]
- }];
- @throw error;
- }
-}
-
-AVCaptureFlashMode FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashMode mode) {
- switch (mode) {
- case FLTFlashModeOff:
- return AVCaptureFlashModeOff;
- case FLTFlashModeAuto:
- return AVCaptureFlashModeAuto;
- case FLTFlashModeAlways:
- return AVCaptureFlashModeOn;
- case FLTFlashModeTorch:
- default:
- return -1;
- }
-}