[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;
-  }
-}