Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
b915f7d
Locked hacking
camsim99 Feb 20, 2024
0b33c78
This works but may need to swap in/out af points. I will see
camsim99 Feb 21, 2024
03b2095
Merge remote-tracking branch 'upstream/main' into camx_fmode
camsim99 Feb 21, 2024
f1bdb1f
Formatting
camsim99 Feb 21, 2024
bd1f1ba
Undo incorrect test changes
camsim99 Feb 21, 2024
24dd03b
Undo more changes
camsim99 Feb 21, 2024
f73c2fb
Add disableAutoCancel param + leave todos for case handling
camsim99 Feb 21, 2024
d4d1588
Formatting
camsim99 Feb 21, 2024
dd4f6b3
Add case logic
camsim99 Feb 22, 2024
b902c04
Add todo for AWB
camsim99 Feb 22, 2024
81a5170
Merge remote-tracking branch 'upstream/main' into camx_fmode
camsim99 Feb 22, 2024
72d2d5f
Manual testing
camsim99 Feb 26, 2024
32118bc
Self review
camsim99 Feb 26, 2024
da114ab
Start adding tests
camsim99 Feb 27, 2024
2965929
Add more tests
camsim99 Feb 27, 2024
861ae64
Adding more tests
camsim99 Feb 27, 2024
211962d
Merge remote-tracking branch 'upstream/main' into camx_fmode
camsim99 Feb 27, 2024
23d23ed
Finish adding tests
camsim99 Feb 27, 2024
49392ae
Self review 2
camsim99 Feb 27, 2024
faa61c5
Java fixes
camsim99 Feb 27, 2024
d025a79
Nits
camsim99 Feb 27, 2024
f8d1a6d
Add scott warning
camsim99 Feb 27, 2024
d4b4998
Merge remote-tracking branch 'upstream/main' into camx_fmode
camsim99 Feb 27, 2024
7b2fb39
Address part of review + bump version to 0.6.0
camsim99 Mar 6, 2024
7ff3bc6
Use results
camsim99 Mar 8, 2024
81d0453
Add todo fix resetting mode
camsim99 Mar 11, 2024
1ec2045
Final fixes
camsim99 Mar 11, 2024
92123c3
Fix tests
camsim99 Mar 11, 2024
94622d0
Merge remote-tracking branch 'upstream/main' into camx_fmode
camsim99 Mar 11, 2024
b3d72cb
Add additional tests
camsim99 Mar 11, 2024
54e8fd3
Avoid breaking readme
camsim99 Mar 18, 2024
9568190
Update packages/camera/camera_android_camerax/CHANGELOG.md
camsim99 Mar 19, 2024
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
Prev Previous commit
Next Next commit
Add more tests
  • Loading branch information
camsim99 committed Feb 27, 2024
commit 29659297bcbb3387be257fc3ff499b4a1e1fc956
Original file line number Diff line number Diff line change
Expand Up @@ -2579,9 +2579,6 @@ void main() {
final MockCameraControl mockCameraControl = MockCameraControl();
final MockCamera2CameraControl mockCamera2CameraControl =
MockCamera2CameraControl();
// const double defaultFocusPointX = 0.5;
// const double defaultFocusPointY = 0.5;
// const double defaultFocusPointSize = 1;

// Set directly for test versus calling createCamera.
camera.cameraInfo = MockCameraInfo();
Expand All @@ -2603,22 +2600,10 @@ void main() {
await camera.setFocusMode(cameraId, FocusMode.auto);

verify(mockCameraControl.cancelFocusAndMetering());

// final VerificationResult verificationResult =
// verify(mockCameraControl.startFocusAndMetering(captureAny));
// final FocusMeteringAction capturedAction =
// verificationResult.captured.single as FocusMeteringAction;
// final List<(MeteringPoint, int?)> capturedMeteringPointInfos =
// capturedAction.meteringPointInfos;
// expect(capturedMeteringPointInfos.length, equals(1));
// expect(capturedMeteringPointInfos.first.$1.x, equals(defaultFocusPointX));
// expect(capturedMeteringPointInfos.first.$1.y, equals(defaultFocusPointY));
// expect(capturedMeteringPointInfos.first.$1.size,
// equals(defaultFocusPointSize));
// expect(capturedMeteringPointInfos.first.$2,
// equals(FocusMeteringAction.flagAf));
});

// TODO(camsim99): Add different test for canceling f and m

test(
'setFocusMode re-focuses on previously set auto-focus point with auto-canceled enabled if setting auto-focus mode',
() async {
Expand All @@ -2643,7 +2628,7 @@ void main() {
// Tell plugin that there is no current focus and metering action.
camera.currentFocusMeteringAction = null;

// Lock focus a focus point.
// Lock a focus point.
await camera.setFocusPoint(
cameraId, const Point<double>(focusPointX, focusPointY));
await camera.setFocusMode(cameraId, FocusMode.locked);
Expand All @@ -2668,16 +2653,235 @@ void main() {
});

test(
'setFocusMode starts expected focus and metering action if setting locked focus mode and current focus and metering action has auto-focus point',
() async {});
'setFocusMode starts expected focus and metering action with default auto-focus point if setting locked focus mode and current focus and metering action has auto-focus point',
() async {
final AndroidCameraCameraX camera = AndroidCameraCameraX();
const int cameraId = 7;
final MockCameraControl mockCameraControl = MockCameraControl();
final MockCamera2CameraControl mockCamera2CameraControl =
MockCamera2CameraControl();
const double focusPointX = 0.88;
const double focusPointY = 0.33;

// Set directly for test versus calling createCamera.
camera.cameraInfo = MockCameraInfo();
camera.cameraControl = mockCameraControl;

when(mockCamera2CameraControl.addCaptureRequestOptions(any))
.thenAnswer((_) async => Future<void>.value());

camera.proxy = getProxyForSettingFocusPoint(
mockCameraControl, mockCamera2CameraControl);

// Tell plugin that there is no current focus and metering action.
camera.currentFocusMeteringAction = null;

// Set a focus point.
await camera.setFocusPoint(
cameraId, const Point<double>(focusPointX, focusPointY));
clearInteractions(mockCameraControl);

// Lock focus point.
await camera.setFocusMode(cameraId, FocusMode.locked);

final VerificationResult verificationResult =
verify(mockCameraControl.startFocusAndMetering(captureAny));
final FocusMeteringAction capturedAction =
verificationResult.captured.single as FocusMeteringAction;
expect(capturedAction.disableAutoCancel, isTrue);

// We expect the set focus point to be locked.
final List<(MeteringPoint, int?)> capturedMeteringPointInfos =
capturedAction.meteringPointInfos;
expect(capturedMeteringPointInfos.length, equals(1));
expect(capturedMeteringPointInfos.first.$1.x, equals(focusPointX));
expect(capturedMeteringPointInfos.first.$1.y, equals(focusPointY));
expect(capturedMeteringPointInfos.first.$1.size, isNull);
expect(capturedMeteringPointInfos.first.$2,
equals(FocusMeteringAction.flagAf));
});

test(
'setFocusMode starts expected focus and metering action with default auto-focus point if setting locked focus mode and current focus and metering action has auto-focus point amongst others',
() async {
final AndroidCameraCameraX camera = AndroidCameraCameraX();
const int cameraId = 8;
final MockCameraControl mockCameraControl = MockCameraControl();
final MockCamera2CameraControl mockCamera2CameraControl =
MockCamera2CameraControl();
const double focusPointX = 0.38;
const double focusPointY = 0.38;
const double exposurePointX = 0.54;
const double exposurePointY = 0.45;

// Set directly for test versus calling createCamera.
camera.cameraInfo = MockCameraInfo();
camera.cameraControl = mockCameraControl;

when(mockCamera2CameraControl.addCaptureRequestOptions(any))
.thenAnswer((_) async => Future<void>.value());

camera.proxy = getProxyForSettingFocusPoint(
mockCameraControl, mockCamera2CameraControl);

// Tell plugin that there is no current focus and metering action.
camera.currentFocusMeteringAction = null;

// Set a focus point.
await camera.setFocusPoint(
cameraId, const Point<double>(focusPointX, focusPointY));
await camera.setExposurePoint(
cameraId, const Point<double>(exposurePointX, exposurePointY));
clearInteractions(mockCameraControl);

// Lock focus point.
await camera.setFocusMode(cameraId, FocusMode.locked);

final VerificationResult verificationResult =
verify(mockCameraControl.startFocusAndMetering(captureAny));
final FocusMeteringAction capturedAction =
verificationResult.captured.single as FocusMeteringAction;
expect(capturedAction.disableAutoCancel, isTrue);

// We expect two MeteringPoints, the set focus point and the set exposure
// point.
final List<(MeteringPoint, int?)> capturedMeteringPointInfos =
capturedAction.meteringPointInfos;
expect(capturedMeteringPointInfos.length, equals(2));

final List<(MeteringPoint, int?)> focusPoints = capturedMeteringPointInfos
.where(((MeteringPoint, int?) meteringPointInfo) =>
meteringPointInfo.$2 == FocusMeteringAction.flagAf)
.toList();
expect(focusPoints.length, equals(1));
expect(focusPoints.first.$1.x, equals(focusPointX));
expect(focusPoints.first.$1.y, equals(focusPointY));
expect(focusPoints.first.$1.size, isNull);

final List<(MeteringPoint, int?)> exposurePoints =
capturedMeteringPointInfos
.where(((MeteringPoint, int?) meteringPointInfo) =>
meteringPointInfo.$2 == FocusMeteringAction.flagAe)
.toList();
expect(exposurePoints.length, equals(1));
expect(exposurePoints.first.$1.x, equals(exposurePointX));
expect(exposurePoints.first.$1.y, equals(exposurePointY));
});

test(
'setFocusMode starts expected focus and metering action if setting locked focus mode and current focus and metering action does not auto-focus point',
() async {});
'setFocusMode starts expected focus and metering action if setting locked focus mode and current focus and metering action does not contain an auto-focus point',
() async {
final AndroidCameraCameraX camera = AndroidCameraCameraX();
const int cameraId = 9;
final MockCameraControl mockCameraControl = MockCameraControl();
final MockCamera2CameraControl mockCamera2CameraControl =
MockCamera2CameraControl();
const double exposurePointX = 0.8;
const double exposurePointY = 0.3;
const double defaultFocusPointX = 0.5;
const double defaultFocusPointY = 0.5;
const double defaultFocusPointSize = 1;

// Set directly for test versus calling createCamera.
camera.cameraInfo = MockCameraInfo();
camera.cameraControl = mockCameraControl;

when(mockCamera2CameraControl.addCaptureRequestOptions(any))
.thenAnswer((_) async => Future<void>.value());

camera.proxy = getProxyForSettingFocusPoint(
mockCameraControl, mockCamera2CameraControl);

// Tell plugin that there is no current focus and metering action.
camera.currentFocusMeteringAction = null;

// Set an exposure point (creates a current focus and metering action
// without a focus point).
await camera.setExposurePoint(
cameraId, const Point<double>(exposurePointX, exposurePointY));
clearInteractions(mockCameraControl);

// Lock focus point.
await camera.setFocusMode(cameraId, FocusMode.locked);

final VerificationResult verificationResult =
verify(mockCameraControl.startFocusAndMetering(captureAny));
final FocusMeteringAction capturedAction =
verificationResult.captured.single as FocusMeteringAction;
expect(capturedAction.disableAutoCancel, isTrue);

// We expect two MeteringPoints, the default focus point and the set
//exposure point.
final List<(MeteringPoint, int?)> capturedMeteringPointInfos =
capturedAction.meteringPointInfos;
expect(capturedMeteringPointInfos.length, equals(2));

final List<(MeteringPoint, int?)> focusPoints = capturedMeteringPointInfos
.where(((MeteringPoint, int?) meteringPointInfo) =>
meteringPointInfo.$2 == FocusMeteringAction.flagAf)
.toList();
expect(focusPoints.length, equals(1));
expect(focusPoints.first.$1.x, equals(defaultFocusPointX));
expect(focusPoints.first.$1.y, equals(defaultFocusPointY));
expect(focusPoints.first.$1.size, equals(defaultFocusPointSize));

final List<(MeteringPoint, int?)> exposurePoints =
capturedMeteringPointInfos
.where(((MeteringPoint, int?) meteringPointInfo) =>
meteringPointInfo.$2 == FocusMeteringAction.flagAe)
.toList();
expect(exposurePoints.length, equals(1));
expect(exposurePoints.first.$1.x, equals(exposurePointX));
expect(exposurePoints.first.$1.y, equals(exposurePointY));
expect(exposurePoints.first.$1.size, isNull);
});

test(
'setFocusMode starts expected focus and metering action if there is no current focus and metering action',
() async {});
() async {
final AndroidCameraCameraX camera = AndroidCameraCameraX();
const int cameraId = 10;
final MockCameraControl mockCameraControl = MockCameraControl();
final MockCamera2CameraControl mockCamera2CameraControl =
MockCamera2CameraControl();
const double defaultFocusPointX = 0.5;
const double defaultFocusPointY = 0.5;
const double defaultFocusPointSize = 1;

// Set directly for test versus calling createCamera.
camera.cameraInfo = MockCameraInfo();
camera.cameraControl = mockCameraControl;

when(mockCamera2CameraControl.addCaptureRequestOptions(any))
.thenAnswer((_) async => Future<void>.value());

camera.proxy = getProxyForSettingFocusPoint(
mockCameraControl, mockCamera2CameraControl);

// Tell plugin that there is no current focus and metering action.
camera.currentFocusMeteringAction = null;

// Lock focus point.
await camera.setFocusMode(cameraId, FocusMode.locked);

final VerificationResult verificationResult =
verify(mockCameraControl.startFocusAndMetering(captureAny));
final FocusMeteringAction capturedAction =
verificationResult.captured.single as FocusMeteringAction;
expect(capturedAction.disableAutoCancel, isTrue);

// We expect only the default focus point to be set.
final List<(MeteringPoint, int?)> capturedMeteringPointInfos =
capturedAction.meteringPointInfos;
expect(capturedMeteringPointInfos.length, equals(1));
expect(capturedMeteringPointInfos.length, equals(1));
expect(capturedMeteringPointInfos.first.$1.x, equals(defaultFocusPointX));
expect(capturedMeteringPointInfos.first.$1.y, equals(defaultFocusPointY));
expect(capturedMeteringPointInfos.first.$1.size,
equals(defaultFocusPointSize));
expect(capturedMeteringPointInfos.first.$2,
equals(FocusMeteringAction.flagAf));
});

test(
'setFocusMode re-sets exposure mode if setting locked focus mode while using auto exposure mode',
Expand Down