Skip to content

Commit 228c2b1

Browse files
authored
[camerax] Add flash configuration for image capture (#3800)
Implements off, auto, and always flash configurations for image capture. Part of flutter/flutter#120715.
1 parent dc41ccc commit 228c2b1

File tree

5 files changed

+66
-7
lines changed

5 files changed

+66
-7
lines changed

packages/camera/camera_android_camerax/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.5.0+10
2+
3+
* Implements off, auto, and always flash mode configurations for image capture.
4+
15
## 0.5.0+9
26

37
* Marks all Dart-wrapped Android native classes as `@immutable`.

packages/camera/camera_android_camerax/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ Any specified `ResolutionPreset` wll go unused in favor of CameraX defaults and
3535

3636
### Flash mode configuration \[[Issue #120715][120715]\]
3737

38-
`setFlashMode` is unimplemented.
38+
Calling `setFlashMode` with mode `FlashMode.torch` currently does nothing.
3939

4040
### Exposure mode, point, & offset configuration \[[Issue #120468][120468]\]
4141

packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ class AndroidCameraCameraX extends CameraPlatform {
104104
@visibleForTesting
105105
ImageCapture? imageCapture;
106106

107+
/// The flash mode currently configured for [imageCapture].
108+
int? _currentFlashMode;
109+
107110
/// The [ImageAnalysis] instance that can be configured to analyze individual
108111
/// frames.
109112
ImageAnalysis? imageAnalysis;
@@ -459,13 +462,32 @@ class AndroidCameraCameraX extends CameraPlatform {
459462
/// [cameraId] is not used.
460463
@override
461464
Future<XFile> takePicture(int cameraId) async {
462-
// TODO(camsim99): Add support for flash mode configuration.
463-
// https://github.com/flutter/flutter/issues/120715
465+
if (_currentFlashMode != null) {
466+
await imageCapture!.setFlashMode(_currentFlashMode!);
467+
}
464468
final String picturePath = await imageCapture!.takePicture();
465-
466469
return XFile(picturePath);
467470
}
468471

472+
/// Sets the flash mode for the selected camera.
473+
@override
474+
Future<void> setFlashMode(int cameraId, FlashMode mode) async {
475+
switch (mode) {
476+
case FlashMode.off:
477+
_currentFlashMode = ImageCapture.flashModeOff;
478+
break;
479+
case FlashMode.auto:
480+
_currentFlashMode = ImageCapture.flashModeAuto;
481+
break;
482+
case FlashMode.always:
483+
_currentFlashMode = ImageCapture.flashModeOn;
484+
break;
485+
case FlashMode.torch:
486+
// TODO(camsim99): Implement torch mode when CameraControl is wrapped.
487+
break;
488+
}
489+
}
490+
469491
/// Configures and starts a video recording. Returns silently without doing
470492
/// anything if there is currently an active recording.
471493
@override

packages/camera/camera_android_camerax/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: camera_android_camerax
22
description: Android implementation of the camera plugin using the CameraX library.
33
repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android_camerax
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
5-
version: 0.5.0+9
5+
version: 0.5.0+10
66

77
environment:
88
sdk: ">=2.19.0 <4.0.0"

packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -779,8 +779,6 @@ void main() {
779779
final AndroidCameraCameraX camera = AndroidCameraCameraX();
780780
const String testPicturePath = 'test/absolute/path/to/picture';
781781

782-
camera.processCameraProvider = MockProcessCameraProvider();
783-
camera.cameraSelector = MockCameraSelector();
784782
camera.imageCapture = MockImageCapture();
785783

786784
when(camera.imageCapture!.takePicture())
@@ -791,6 +789,41 @@ void main() {
791789
expect(imageFile.path, equals(testPicturePath));
792790
});
793791

792+
test('setFlashMode configures ImageCapture with expected flash mode',
793+
() async {
794+
final AndroidCameraCameraX camera = AndroidCameraCameraX();
795+
const int cameraId = 22;
796+
797+
camera.imageCapture = MockImageCapture();
798+
799+
for (final FlashMode flashMode in FlashMode.values) {
800+
await camera.setFlashMode(cameraId, flashMode);
801+
802+
int? expectedFlashMode;
803+
switch (flashMode) {
804+
case FlashMode.off:
805+
expectedFlashMode = ImageCapture.flashModeOff;
806+
break;
807+
case FlashMode.auto:
808+
expectedFlashMode = ImageCapture.flashModeAuto;
809+
break;
810+
case FlashMode.always:
811+
expectedFlashMode = ImageCapture.flashModeOn;
812+
break;
813+
case FlashMode.torch:
814+
// TODO(camsim99): Test torch mode when implemented.
815+
break;
816+
}
817+
818+
if (expectedFlashMode == null) {
819+
continue;
820+
}
821+
822+
await camera.takePicture(cameraId);
823+
verify(camera.imageCapture!.setFlashMode(expectedFlashMode));
824+
}
825+
});
826+
794827
test('getMinExposureOffset returns expected exposure offset', () async {
795828
final AndroidCameraCameraX camera = AndroidCameraCameraX();
796829
final MockCameraInfo mockCameraInfo = MockCameraInfo();

0 commit comments

Comments
 (0)