Skip to content

[camera_android] Provides a default exposure point if null. #3851

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 40 commits into from
Jul 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
5de5fe6
[camera_android] Provides a default exposure point if null.
Mairramer Apr 29, 2023
42a0dfa
fix CHANGELOG.md
Mairramer Apr 29, 2023
f7d396c
[camera_android] fix shouldReset method
Mairramer Apr 29, 2023
b6eb659
remove unnecessary code duplication
Mairramer May 2, 2023
35d06b6
Merge branch 'main' into camera_exposure_fix
Mairramer May 2, 2023
f0b2a8e
fix tests
Mairramer May 3, 2023
47e29c0
Merge branch 'main' into camera_exposure_fix
Mairramer May 3, 2023
b54da73
Merge branch 'main' into camera_exposure_fix
Mairramer May 9, 2023
21be4a5
update shouldReset method
Mairramer May 9, 2023
bd23ce5
Merge branch 'main' into camera_exposure_fix
Mairramer May 10, 2023
a9ca844
Merge branch 'main' into camera_exposure_fix
Mairramer May 11, 2023
b531c28
[camera_android] added method to create default exposure
Mairramer May 30, 2023
09865ad
Merge branch 'main' into camera_exposure_fix
Mairramer May 30, 2023
ceec022
nullable annotation
Mairramer May 30, 2023
ede1627
Merge branch 'main' into camera_exposure_fix
Mairramer May 30, 2023
f0c3c20
added try catch
Mairramer May 30, 2023
a8e7f74
Merge branch 'main' into camera_exposure_fix
Mairramer Jun 5, 2023
f57a167
refactor unnecessary methods
Mairramer Jun 5, 2023
a27be59
added IllegalArgumentException
Mairramer Jun 5, 2023
9a78407
remove dead code
Mairramer Jun 5, 2023
9278364
fix version
Mairramer Jun 5, 2023
f4209a6
Merge branch 'main' into camera_exposure_fix
Mairramer Jun 5, 2023
8e3f2ee
Merge branch 'main' into camera_exposure_fix
Mairramer Jun 6, 2023
234981d
Merge branch 'main' into camera_exposure_fix
reidbaker Jul 13, 2023
49d5b33
[camera_android] set default exposure rectangle
Mairramer Jul 15, 2023
19a60e0
Merge branch 'main' into camera_exposure_fix
Mairramer Jul 15, 2023
fd74bf9
remove comment
Mairramer Jul 17, 2023
ee57798
refactor logic
Mairramer Jul 17, 2023
cb382e8
Merge branch 'main' into camera_exposure_fix
Mairramer Jul 18, 2023
ba19e89
added new logic
Mairramer Jul 18, 2023
2ad4c91
Merge branch 'main' into camera_exposure_fix
Mairramer Jul 18, 2023
88ecbf1
refactor logic
Mairramer Jul 19, 2023
583a0fd
rename test
Mairramer Jul 19, 2023
f16fab4
Merge branch 'main' into camera_exposure_fix
Mairramer Jul 19, 2023
40630f1
improve tests
Mairramer Jul 24, 2023
4ddad4c
improve mocks exposure tests
Mairramer Jul 26, 2023
e4c7e1e
Merge branch 'main' into camera_exposure_fix
Mairramer Jul 27, 2023
f84bf60
Update pubspec.yaml
Mairramer Jul 27, 2023
c1c3a8c
change version
Mairramer Jul 27, 2023
1ce574e
Merge branch 'main' into camera_exposure_fix
Mairramer Jul 27, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/camera/camera_android/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.10.8+5

* Provides a default exposure point if null.

## 0.10.8+4

* Adjusts SDK checks for better testability.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import android.util.Size;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
import io.flutter.plugins.camera.CameraProperties;
import io.flutter.plugins.camera.CameraRegionUtils;
Expand All @@ -24,6 +25,8 @@ public class ExposurePointFeature extends CameraFeature<Point> {
@Nullable private Point exposurePoint;
private MeteringRectangle exposureRectangle;
@NonNull private final SensorOrientationFeature sensorOrientationFeature;
private boolean defaultRegionsHasBeenSet = false;
@VisibleForTesting @Nullable public MeteringRectangle[] defaultRegions;

/**
* Creates a new instance of the {@link ExposurePointFeature}.
Expand Down Expand Up @@ -78,9 +81,18 @@ public void updateBuilder(@NonNull CaptureRequest.Builder requestBuilder) {
if (!checkIsSupported()) {
return;
}
requestBuilder.set(
CaptureRequest.CONTROL_AE_REGIONS,
exposureRectangle == null ? null : new MeteringRectangle[] {exposureRectangle});

if (!defaultRegionsHasBeenSet) {
defaultRegions = requestBuilder.get(CaptureRequest.CONTROL_AE_REGIONS);
defaultRegionsHasBeenSet = true;
}

if (exposureRectangle != null) {
requestBuilder.set(
CaptureRequest.CONTROL_AE_REGIONS, new MeteringRectangle[] {exposureRectangle});
} else {
requestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, defaultRegions);
}
}

private void buildExposureRectangle() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
Expand Down Expand Up @@ -281,7 +281,7 @@ public void updateBuilder_shouldSetMeteringRectangleWhenValidBoundariesAndCoords
}

@Test
public void updateBuilder_shouldNotSetMeteringRectangleWhenNoValidBoundariesAreSupplied() {
public void updateBuilder_shoulSetDefaultMeteringRectangleWhenNoValidBoundariesAreSupplied() {
CameraProperties mockCameraProperties = mock(CameraProperties.class);
when(mockCameraProperties.getControlMaxRegionsAutoExposure()).thenReturn(1);
CaptureRequest.Builder mockCaptureRequestBuilder = mock(CaptureRequest.Builder.class);
Expand All @@ -290,24 +290,52 @@ public void updateBuilder_shouldNotSetMeteringRectangleWhenNoValidBoundariesAreS

exposurePointFeature.updateBuilder(mockCaptureRequestBuilder);

verify(mockCaptureRequestBuilder, times(1)).set(any(), isNull());
verify(mockCaptureRequestBuilder, times(1)).set(any(), any());
}

@Test
public void updateBuilder_shouldNotSetMeteringRectangleWhenNoValidCoordsAreSupplied() {
public void updateBuilder_shouldSetDefaultMeteringRectangleWhenNoValidCoordsAreSupplied() {
CameraProperties mockCameraProperties = mock(CameraProperties.class);
when(mockCameraProperties.getControlMaxRegionsAutoExposure()).thenReturn(1);
CaptureRequest.Builder mockCaptureRequestBuilder = mock(CaptureRequest.Builder.class);
ExposurePointFeature exposurePointFeature =
new ExposurePointFeature(mockCameraProperties, mockSensorOrientationFeature);
exposurePointFeature.setCameraBoundaries(this.mockCameraBoundaries);

MeteringRectangle[] defaultRegions =
new MeteringRectangle[] {new MeteringRectangle(0, 0, 100, 100, 0)};
when(mockCaptureRequestBuilder.get(CaptureRequest.CONTROL_AE_REGIONS))
.thenReturn(defaultRegions);

exposurePointFeature.setValue(null);
exposurePointFeature.updateBuilder(mockCaptureRequestBuilder);
exposurePointFeature.setValue(new Point(0d, null));
exposurePointFeature.updateBuilder(mockCaptureRequestBuilder);
exposurePointFeature.setValue(new Point(null, 0d));
exposurePointFeature.updateBuilder(mockCaptureRequestBuilder);
verify(mockCaptureRequestBuilder, times(3)).set(any(), isNull());

verify(mockCaptureRequestBuilder, times(3)).set(any(), eq(defaultRegions));
}

@Test
public void updateBuilder_shouldSetNonNullMeteringRectangleWhenNullValueIsSupplied() {
CameraProperties mockCameraProperties = mock(CameraProperties.class);
when(mockCameraProperties.getControlMaxRegionsAutoExposure()).thenReturn(1);
CaptureRequest.Builder mockCaptureRequestBuilder = mock(CaptureRequest.Builder.class);
ExposurePointFeature exposurePointFeature =
new ExposurePointFeature(mockCameraProperties, mockSensorOrientationFeature);

MeteringRectangle[] defaultRegions =
new MeteringRectangle[] {new MeteringRectangle(0, 0, 100, 100, 0)};
when(mockCaptureRequestBuilder.get(CaptureRequest.CONTROL_AE_REGIONS))
.thenReturn(defaultRegions);

exposurePointFeature.setCameraBoundaries(this.mockCameraBoundaries);

exposurePointFeature.setValue(null);

exposurePointFeature.updateBuilder(mockCaptureRequestBuilder);

verify(mockCaptureRequestBuilder, times(1)).set(any(), eq(exposurePointFeature.defaultRegions));
}
}
2 changes: 1 addition & 1 deletion packages/camera/camera_android/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ 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.8+4
version: 0.10.8+5

environment:
sdk: ">=2.18.0 <4.0.0"
Expand Down