From 622ba57c3960e511bdd4adabe800aef844e263fc Mon Sep 17 00:00:00 2001 From: Bodhi Mulders Date: Tue, 22 Dec 2020 23:28:30 +0100 Subject: [PATCH] [camera] Add implementations for the torch flash mode. (#3338) * Added torch mode functionality for Android and iOS. * Format objective c code --- packages/camera/camera/CHANGELOG.md | 4 + .../io/flutter/plugins/camera/Camera.java | 8 +- .../plugins/camera/types/FlashMode.java | 3 +- .../plugins/camera/types/FlashModeTest.java | 4 + packages/camera/camera/example/lib/main.dart | 9 ++ .../camera/camera/ios/Classes/CameraPlugin.m | 99 +++++++++++++++---- packages/camera/camera/pubspec.yaml | 2 +- .../method_channel_camera_test.dart | 3 + 8 files changed, 108 insertions(+), 24 deletions(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index 2811384a7d3b6b..b407b83e35db25 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.3 + +* Adds torch mode as a flash mode for Android and iOS implementations. + ## 0.6.2+1 * Fix the API documentation for the `CameraController.takePicture` method. diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 3e8bbc7b295bd8..cae666d6742aac 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -532,7 +532,6 @@ public void setFlashMode(@NonNull final Result result, FlashMode mode) return; } // Get flash - this.flashMode = mode; initPreviewCaptureBuilder(); this.cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null); @@ -553,11 +552,16 @@ private void initPreviewCaptureBuilder() { captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); break; case always: - default: captureRequestBuilder.set( CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH); captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); break; + case torch: + default: + captureRequestBuilder.set( + CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); + captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH); + break; } } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/types/FlashMode.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/types/FlashMode.java index eddeddc47eabf9..99d4915b3a6a04 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/types/FlashMode.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/types/FlashMode.java @@ -4,7 +4,8 @@ public enum FlashMode { off, auto, - always; + always, + torch; public static FlashMode getValueForString(String modeStr) { try { diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/FlashModeTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/FlashModeTest.java index 0549e4fc750e05..d2674e8c7e0629 100644 --- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/FlashModeTest.java +++ b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/FlashModeTest.java @@ -16,6 +16,10 @@ public void getValueForString_returns_correct_values() { "Returns FlashMode.always for 'always'", FlashMode.getValueForString("always"), FlashMode.always); + assertEquals( + "Returns FlashMode.torch for 'torch'", + FlashMode.getValueForString("torch"), + FlashMode.torch); } @Test diff --git a/packages/camera/camera/example/lib/main.dart b/packages/camera/camera/example/lib/main.dart index 049141d3935e1f..ee8e2c259b3d45 100644 --- a/packages/camera/camera/example/lib/main.dart +++ b/packages/camera/camera/example/lib/main.dart @@ -256,6 +256,15 @@ class _CameraExampleHomeState extends State ? () => onFlashModeButtonPressed(FlashMode.always) : null, ), + IconButton( + icon: const Icon(Icons.highlight), + color: controller?.value?.flashMode == FlashMode.torch + ? Colors.orange + : Colors.blue, + onPressed: controller != null + ? () => onFlashModeButtonPressed(FlashMode.torch) + : null, + ), ], ); } diff --git a/packages/camera/camera/ios/Classes/CameraPlugin.m b/packages/camera/camera/ios/Classes/CameraPlugin.m index c13ff60abd0abe..d54695233bdbf3 100644 --- a/packages/camera/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/camera/ios/Classes/CameraPlugin.m @@ -134,13 +134,23 @@ - (UIImageOrientation)getImageRotation { } @end -static AVCaptureFlashMode getFlashModeForString(NSString *mode) { +// Mirrors FlashMode in flash_mode.dart +typedef enum { + FlashModeOff, + FlashModeAuto, + FlashModeAlways, + FlashModeTorch, +} FlashMode; + +static FlashMode getFlashModeForString(NSString *mode) { if ([mode isEqualToString:@"off"]) { - return AVCaptureFlashModeOff; + return FlashModeOff; } else if ([mode isEqualToString:@"auto"]) { - return AVCaptureFlashModeAuto; + return FlashModeAuto; } else if ([mode isEqualToString:@"always"]) { - return AVCaptureFlashModeOn; + return FlashModeAlways; + } else if ([mode isEqualToString:@"torch"]) { + return FlashModeTorch; } else { NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain code:NSURLErrorUnknown @@ -152,6 +162,20 @@ static AVCaptureFlashMode getFlashModeForString(NSString *mode) { } } +static AVCaptureFlashMode getAVCaptureFlashModeForFlashMode(FlashMode mode) { + switch (mode) { + case FlashModeOff: + return AVCaptureFlashModeOff; + case FlashModeAuto: + return AVCaptureFlashModeAuto; + case FlashModeAlways: + return AVCaptureFlashModeOn; + case FlashModeTorch: + default: + return -1; + } +} + // Mirrors ResolutionPreset in camera.dart typedef enum { veryLow, @@ -219,7 +243,7 @@ @interface FLTCam : NSObject [ + isMethodCall('setFlashMode', + arguments: {'cameraId': cameraId, 'mode': 'torch'}), isMethodCall('setFlashMode', arguments: {'cameraId': cameraId, 'mode': 'always'}), isMethodCall('setFlashMode',