diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index c1cd97e1248..dfda66432aa 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.8 + +* Provides a default exposure point if null. + ## 0.10.7 * Adds support for NV21 as a new streaming format in Android which includes correct handling of diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePointFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePointFeature.java index 40f28eadc04..21bc341b2e1 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePointFeature.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePointFeature.java @@ -22,6 +22,8 @@ public class ExposurePointFeature extends CameraFeature { private Size cameraBoundaries; @Nullable private Point exposurePoint; + private Point exposurePoint; + private MeteringRectangle[] defaultExposureRectangle; private MeteringRectangle exposureRectangle; @NonNull private final SensorOrientationFeature sensorOrientationFeature; @@ -78,9 +80,15 @@ public void updateBuilder(@NonNull CaptureRequest.Builder requestBuilder) { if (!checkIsSupported()) { return; } - requestBuilder.set( - CaptureRequest.CONTROL_AE_REGIONS, - exposureRectangle == null ? null : new MeteringRectangle[] {exposureRectangle}); + if (defaultExposureRectangle == null) { + defaultExposureRectangle = requestBuilder.get(CaptureRequest.CONTROL_AE_REGIONS); + } + if (exposureRectangle != null) { + requestBuilder.set( + CaptureRequest.CONTROL_AE_REGIONS, new MeteringRectangle[] {exposureRectangle}); + } else if (shouldReset(requestBuilder)) { + requestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, defaultExposureRectangle); + } } private void buildExposureRectangle() { @@ -102,4 +110,9 @@ private void buildExposureRectangle() { this.cameraBoundaries, this.exposurePoint.x, this.exposurePoint.y, orientation); } } + + public boolean shouldReset(CaptureRequest.Builder requestBuilder) { + MeteringRectangle[] currentRectangles = requestBuilder.get(CaptureRequest.CONTROL_AE_REGIONS); + return currentRectangles == null || currentRectangles.length == 0; + } } diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePointFeatureTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePointFeatureTest.java index 800c3f74d1d..3fd7748182d 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePointFeatureTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePointFeatureTest.java @@ -35,6 +35,8 @@ public class ExposurePointFeatureTest { Size mockCameraBoundaries; SensorOrientationFeature mockSensorOrientationFeature; DeviceOrientationManager mockDeviceOrientationManager; + MeteringRectangle[] mockDefaultExposureRectangle; + MeteringRectangle mockExposureRectangle; @Before public void setUp() { @@ -308,6 +310,24 @@ public void updateBuilder_shouldNotSetMeteringRectangleWhenNoValidCoordsAreSuppl exposurePointFeature.updateBuilder(mockCaptureRequestBuilder); exposurePointFeature.setValue(new Point(null, 0d)); exposurePointFeature.updateBuilder(mockCaptureRequestBuilder); + verify(mockCaptureRequestBuilder, times(3)).set(any(), isNull()); } + + @Test + public void testShouldResetReturnsFalse() { + CaptureRequest.Builder mockCaptureRequestBuilder = mock(CaptureRequest.Builder.class); + MeteringRectangle[] defaultRectangles = new MeteringRectangle[1]; + defaultRectangles[0] = mock(MeteringRectangle.class); + when(mockCaptureRequestBuilder.get(CaptureRequest.CONTROL_AE_REGIONS)) + .thenReturn(defaultRectangles); + mockCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, defaultRectangles); + + ExposurePointFeature exposurePointFeature = mock(ExposurePointFeature.class); + exposurePointFeature.setCameraBoundaries(this.mockCameraBoundaries); + exposurePointFeature.setValue(new Point(0.5, 0.5)); + exposurePointFeature.updateBuilder(mockCaptureRequestBuilder); + + assertFalse(exposurePointFeature.shouldReset(mockCaptureRequestBuilder)); + } } diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index db7835f4ad7..deef7ee6a7c 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -2,7 +2,8 @@ name: camera_android description: Android implementation of the camera plugin. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.10.7 + +version: 0.10.8 environment: sdk: ">=2.17.0 <4.0.0"