From fbbba1665ad6fe8abdb5ac9fd4aaeeda8fac971f Mon Sep 17 00:00:00 2001 From: camsim99 Date: Sat, 22 Apr 2023 12:32:29 -0700 Subject: [PATCH 1/4] Add flash configuration for image capture --- .../lib/src/android_camera_camerax.dart | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart index adafd74f33f9..78c1c95f19aa 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart @@ -292,13 +292,30 @@ class AndroidCameraCameraX extends CameraPlatform { assert(cameraSelector != null); assert(imageCapture != null); - // TODO(camsim99): Add support for flash mode configuration. - // https://github.com/flutter/flutter/issues/120715 final String picturePath = await imageCapture!.takePicture(); return XFile(picturePath); } + /// Sets the flash mode for the selected camera. + @override + Future setFlashMode(int cameraId, FlashMode mode) async { + switch (mode) { + case FlashMode.off: + imageCapture!.setFlashMode(ImageCapture.flashModeOff); + break; + case FlashMode.auto: + imageCapture!.setFlashMode(ImageCapture.flashModeAuto); + break; + case FlashMode.always: + imageCapture!.setFlashMode(ImageCapture.flashModeOn); + break; + case FlashMode.torch: + // TODO(camsim99): Implement torch mode. + break; + } + } + // Methods for binding UseCases to the lifecycle of the camera controlled // by a ProcessCameraProvider instance: From 38dc75a853c38ed63ab04b2c1bd49ef3dca4c65b Mon Sep 17 00:00:00 2001 From: camsim99 Date: Thu, 13 Jul 2023 15:45:35 -0700 Subject: [PATCH 2/4] Fix aproach and add test --- .../lib/src/android_camera_camerax.dart | 14 +++++-- .../test/android_camera_camerax_test.dart | 37 ++++++++++++++++++- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart index 48a2ad949bdf..99f179bbee2d 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart @@ -104,6 +104,9 @@ class AndroidCameraCameraX extends CameraPlatform { @visibleForTesting ImageCapture? imageCapture; + /// The flash mode currently configured for [imageCapture]. + int? _currentFlashMode; + /// The [ImageAnalysis] instance that can be configured to analyze individual /// frames. ImageAnalysis? imageAnalysis; @@ -459,6 +462,9 @@ class AndroidCameraCameraX extends CameraPlatform { /// [cameraId] is not used. @override Future takePicture(int cameraId) async { + if (_currentFlashMode != null) { + await imageCapture!.setFlashMode(_currentFlashMode!); + } final String picturePath = await imageCapture!.takePicture(); return XFile(picturePath); } @@ -468,16 +474,16 @@ class AndroidCameraCameraX extends CameraPlatform { Future setFlashMode(int cameraId, FlashMode mode) async { switch (mode) { case FlashMode.off: - await imageCapture!.setFlashMode(ImageCapture.flashModeOff); + _currentFlashMode = ImageCapture.flashModeOff; break; case FlashMode.auto: - await imageCapture!.setFlashMode(ImageCapture.flashModeAuto); + _currentFlashMode = ImageCapture.flashModeAuto; break; case FlashMode.always: - await imageCapture!.setFlashMode(ImageCapture.flashModeOn); + _currentFlashMode = ImageCapture.flashModeOn; break; case FlashMode.torch: - // TODO(camsim99): Implement torch mode. + // TODO(camsim99): Implement torch mode when CameraControl is wrapped. break; } } diff --git a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart index 258a8344aed9..b1c57e27dab2 100644 --- a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart +++ b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart @@ -779,8 +779,6 @@ void main() { final AndroidCameraCameraX camera = AndroidCameraCameraX(); const String testPicturePath = 'test/absolute/path/to/picture'; - camera.processCameraProvider = MockProcessCameraProvider(); - camera.cameraSelector = MockCameraSelector(); camera.imageCapture = MockImageCapture(); when(camera.imageCapture!.takePicture()) @@ -791,6 +789,41 @@ void main() { expect(imageFile.path, equals(testPicturePath)); }); + test('setFlashMode configures ImageCapture with expected flash mode', + () async { + final AndroidCameraCameraX camera = AndroidCameraCameraX(); + const int cameraId = 22; + + camera.imageCapture = MockImageCapture(); + + for (final FlashMode flashMode in FlashMode.values) { + await camera.setFlashMode(cameraId, flashMode); + + int? expectedFlashMode; + switch (flashMode) { + case FlashMode.off: + expectedFlashMode = ImageCapture.flashModeOff; + break; + case FlashMode.auto: + expectedFlashMode = ImageCapture.flashModeAuto; + break; + case FlashMode.always: + expectedFlashMode = ImageCapture.flashModeOn; + break; + case FlashMode.torch: + // TODO(camsim99): Test torch mode when implemented. + break; + } + + if (expectedFlashMode == null) { + continue; + } + + await camera.takePicture(cameraId); + verify(camera.imageCapture!.setFlashMode(expectedFlashMode)); + } + }); + test('getMinExposureOffset returns expected exposure offset', () async { final AndroidCameraCameraX camera = AndroidCameraCameraX(); final MockCameraInfo mockCameraInfo = MockCameraInfo(); From 8d49bba3f6676144391f149ff5ee9c4f5b134dd2 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Thu, 13 Jul 2023 15:49:56 -0700 Subject: [PATCH 3/4] Update readme and bump version --- packages/camera/camera_android_camerax/CHANGELOG.md | 4 ++++ packages/camera/camera_android_camerax/README.md | 2 +- packages/camera/camera_android_camerax/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index e346f786ce24..5e769e8a92eb 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.0+9 + +* Implements on, off, and auto flash mode configurations for image capture. + ## 0.5.0+8 * Fixes unawaited_futures violations. diff --git a/packages/camera/camera_android_camerax/README.md b/packages/camera/camera_android_camerax/README.md index 9d83ddc185fc..dd6e56338805 100644 --- a/packages/camera/camera_android_camerax/README.md +++ b/packages/camera/camera_android_camerax/README.md @@ -35,7 +35,7 @@ Any specified `ResolutionPreset` wll go unused in favor of CameraX defaults and ### Flash mode configuration \[[Issue #120715][120715]\] -`setFlashMode` is unimplemented. +Calling `setFlashMode` with mode `FlashMode.torch` currently does nothing. ### Exposure mode, point, & offset configuration \[[Issue #120468][120468]\] diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index bc629f7c81bd..3eecf7f9c608 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android_camerax description: Android implementation of the camera plugin using the CameraX library. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android_camerax issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.5.0+8 +version: 0.5.0+9 environment: sdk: ">=2.19.0 <4.0.0" From b9e846ca6eb6284ca237e0def554ecd0aa8bf67b Mon Sep 17 00:00:00 2001 From: camsim99 Date: Thu, 13 Jul 2023 16:11:35 -0700 Subject: [PATCH 4/4] correct flash mode names --- packages/camera/camera_android_camerax/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 5e769e8a92eb..5d573973921c 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.5.0+9 -* Implements on, off, and auto flash mode configurations for image capture. +* Implements off, auto, and always flash mode configurations for image capture. ## 0.5.0+8