From 245a8a086a02d2f6cde294266a450713b9bf9d7c Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Thu, 28 Sep 2023 11:41:17 -0700 Subject: [PATCH] [camera] Fix Android autofocus state reading (#5025) Fixes a typo introduced during a testability refactor that caused the capture state machine to read the wrong value for autofocus state, breaking the state machine. Fixes https://github.com/flutter/flutter/issues/135554 Part of https://github.com/flutter/flutter/issues/84957 --- packages/camera/camera_android/CHANGELOG.md | 4 ++++ .../plugins/camera/CameraCaptureCallback.java | 2 +- .../camera/CameraCaptureCallbackTest.java | 18 ++++++++++++++++++ packages/camera/camera_android/pubspec.yaml | 2 +- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index e809b13d6e..ef2cc5f49f 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.8+12 + +* Fixes handling of autofocus state when taking a picture. + ## 0.10.8+11 * Downgrades AGP version for compatibility with legacy projects. diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraCaptureCallback.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraCaptureCallback.java index 4f5e43593e..2737e80f2f 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraCaptureCallback.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraCaptureCallback.java @@ -31,7 +31,7 @@ class CameraCaptureCallback extends CaptureCallback { CaptureResult.Key aeStateKey = CaptureResult.CONTROL_AE_STATE; @VisibleForTesting @NonNull - CaptureResult.Key afStateKey = CaptureResult.CONTROL_AE_STATE; + CaptureResult.Key afStateKey = CaptureResult.CONTROL_AF_STATE; private CameraCaptureCallback( @NonNull CameraCaptureStateListener cameraStateListener, diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraCaptureCallbackTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraCaptureCallbackTest.java index 75a5b25995..f515b359b8 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraCaptureCallbackTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraCaptureCallbackTest.java @@ -69,4 +69,22 @@ public class CameraCaptureCallbackTest { verify(mockCaptureProps, times(1)).setLastSensorExposureTime(2L); verify(mockCaptureProps, times(1)).setLastSensorSensitivity(3); } + + @Test + public void onCaptureCompleted_checksBothAutoFocusAndAutoExposure() { + CameraCaptureSession mockSession = mock(CameraCaptureSession.class); + CaptureRequest mockRequest = mock(CaptureRequest.class); + TotalCaptureResult mockResult = mock(TotalCaptureResult.class); + + cameraCaptureCallback.onCaptureCompleted(mockSession, mockRequest, mockResult); + + // This is inherently somewhat fragile since it is testing internal implementation details, + // but it is important to test that the code is actually using both of the expected states + // since it's easy to typo one of these constants as the other. Ideally this would be tested + // via the state machine output (CameraCaptureCallbackStatesTest.java), but testing the state + // machine requires overriding the keys, so can't test that the right real keys are used in + // production. + verify(mockResult, times(1)).get(CaptureResult.CONTROL_AE_STATE); + verify(mockResult, times(1)).get(CaptureResult.CONTROL_AF_STATE); + } } diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index f2c68922f1..86f3665dc0 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -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+11 +version: 0.10.8+12 environment: sdk: ">=2.19.0 <4.0.0"