From 5b96d074ab4f79f65ebdd9569db6c773e3acc854 Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Mon, 8 Apr 2024 15:21:21 -0700 Subject: [PATCH 1/6] partial removal, all but one slightly more complicated class of usage from cameratest.java --- .../io/flutter/plugins/camera/Camera.java | 18 ++- .../io/flutter/plugins/camera/CameraTest.java | 147 ++++++++---------- 2 files changed, 80 insertions(+), 85 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java index c6eeb65545b..e56c5504726 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -105,15 +105,18 @@ class Camera * Takes an input/output surface and orients the recording correctly. This is needed because * switching cameras while recording causes the wrong orientation. */ - private VideoRenderer videoRenderer; + @VisibleForTesting + VideoRenderer videoRenderer; /** * Whether or not the camera aligns with the initial way the camera was facing if the camera was * flipped. */ - private int initialCameraFacing; + @VisibleForTesting + int initialCameraFacing; - private final SurfaceTextureEntry flutterTexture; + @VisibleForTesting + final SurfaceTextureEntry flutterTexture; private final VideoCaptureSettings videoCaptureSettings; private final Context applicationContext; final DartMessenger dartMessenger; @@ -130,16 +133,19 @@ class Camera CameraDeviceWrapper cameraDevice; CameraCaptureSession captureSession; - private ImageReader pictureImageReader; + @VisibleForTesting + ImageReader pictureImageReader; ImageStreamReader imageStreamReader; /** {@link CaptureRequest.Builder} for the camera preview */ CaptureRequest.Builder previewRequestBuilder; - private MediaRecorder mediaRecorder; + @VisibleForTesting + MediaRecorder mediaRecorder; /** True when recording video. */ boolean recordingVideo; /** True when the preview is paused. */ - private boolean pausedPreview; + @VisibleForTesting + boolean pausedPreview; private File captureFile; diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 507f2aefe1a..081edef93c2 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -27,6 +27,7 @@ import android.view.Surface; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import androidx.lifecycle.LifecycleObserver; import io.flutter.embedding.engine.systemchannels.PlatformChannel; import io.flutter.plugin.common.EventChannel; @@ -174,8 +175,8 @@ public void before() { mockProfileLegacy.videoFrameRate = 15; when(camera.getRecordingProfileLegacy()).thenReturn(mockProfileLegacy); - TestUtils.setPrivateField(camera, "captureSession", mockCaptureSession); - TestUtils.setPrivateField(camera, "previewRequestBuilder", mockPreviewRequestBuilder); + camera.captureSession = mockCaptureSession; + camera.previewRequestBuilder = mockPreviewRequestBuilder; } @After @@ -556,7 +557,7 @@ public void setZoomLevel_shouldCallErrorOnResultOnCameraAccessException() @Test public void pauseVideoRecording_shouldSendNullResultWhenNotRecording() { - TestUtils.setPrivateField(camera, "recordingVideo", false); + camera.recordingVideo = false; MethodChannel.Result mockResult = mock(MethodChannel.Result.class); camera.pauseVideoRecording(mockResult); @@ -569,8 +570,8 @@ public void pauseVideoRecording_shouldSendNullResultWhenNotRecording() { public void pauseVideoRecording_shouldCallPauseWhenRecordingAndOnAPIN() { MethodChannel.Result mockResult = mock(MethodChannel.Result.class); MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(camera, "recordingVideo", true); + camera.mediaRecorder = mockMediaRecorder; + camera.recordingVideo = true; SdkCapabilityChecker.SDK_VERSION = 24; camera.pauseVideoRecording(mockResult); @@ -582,7 +583,7 @@ public void pauseVideoRecording_shouldCallPauseWhenRecordingAndOnAPIN() { @Test public void pauseVideoRecording_shouldSendVideoRecordingFailedErrorWhenVersionCodeSmallerThenN() { - TestUtils.setPrivateField(camera, "recordingVideo", true); + camera.recordingVideo = true; SdkCapabilityChecker.SDK_VERSION = 23; MethodChannel.Result mockResult = mock(MethodChannel.Result.class); @@ -597,8 +598,8 @@ public void pauseVideoRecording_shouldSendVideoRecordingFailedErrorWhenVersionCo public void pauseVideoRecording_shouldSendVideoRecordingFailedErrorWhenMediaRecorderPauseThrowsIllegalStateException() { MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(camera, "recordingVideo", true); + camera.mediaRecorder = mockMediaRecorder; + camera.recordingVideo = true; SdkCapabilityChecker.SDK_VERSION = 24; IllegalStateException expectedException = new IllegalStateException("Test error message"); @@ -616,7 +617,7 @@ public void pauseVideoRecording_shouldSendVideoRecordingFailedErrorWhenVersionCo @Test public void resumeVideoRecording_shouldSendNullResultWhenNotRecording() { MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - TestUtils.setPrivateField(camera, "recordingVideo", false); + camera.recordingVideo = false; camera.resumeVideoRecording(mockResult); @@ -628,8 +629,8 @@ public void resumeVideoRecording_shouldSendNullResultWhenNotRecording() { public void resumeVideoRecording_shouldCallPauseWhenRecordingAndOnAPIN() { MethodChannel.Result mockResult = mock(MethodChannel.Result.class); MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(camera, "recordingVideo", true); + camera.mediaRecorder = mockMediaRecorder; + camera.recordingVideo = true; SdkCapabilityChecker.SDK_VERSION = 24; camera.resumeVideoRecording(mockResult); @@ -644,9 +645,9 @@ public void setDescriptionWhileRecording_errorsWhenUnsupported() { MethodChannel.Result mockResult = mock(MethodChannel.Result.class); MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); VideoRenderer mockVideoRenderer = mock(VideoRenderer.class); - TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(camera, "recordingVideo", true); - TestUtils.setPrivateField(camera, "videoRenderer", mockVideoRenderer); + camera.mediaRecorder = mockMediaRecorder; + camera.recordingVideo = true; + camera.videoRenderer = mockVideoRenderer; SdkCapabilityChecker.SDK_VERSION = Build.VERSION_CODES.LOLLIPOP; final CameraProperties newCameraProperties = mock(CameraProperties.class); @@ -664,9 +665,9 @@ public void setDescriptionWhileRecording_succeedsWhenSupported() { MethodChannel.Result mockResult = mock(MethodChannel.Result.class); MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); VideoRenderer mockVideoRenderer = mock(VideoRenderer.class); - TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(camera, "recordingVideo", true); - TestUtils.setPrivateField(camera, "videoRenderer", mockVideoRenderer); + camera.mediaRecorder = mockMediaRecorder; + camera.recordingVideo = true; + camera.videoRenderer = mockVideoRenderer; SdkCapabilityChecker.SDK_VERSION = Build.VERSION_CODES.O; final CameraProperties newCameraProperties = mock(CameraProperties.class); @@ -684,15 +685,14 @@ public void startPreview_shouldPullStreamFromVideoRenderer() mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); Size mockSize = mock(Size.class); - TestUtils.setPrivateField(camera, "recordingVideo", true); - TestUtils.setPrivateField(camera, "videoRenderer", mockVideoRenderer); + camera.recordingVideo = true; + camera.videoRenderer = mockVideoRenderer; CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + camera.cameraDevice = fakeCamera; ImageReader mockPictureImageReader = mock(ImageReader.class); - TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); + camera.pictureImageReader = mockPictureImageReader; - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = - (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = (ResolutionFeature) TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); @@ -713,13 +713,12 @@ public void startPreview_shouldPullStreamFromImageReader() SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); Size mockSize = mock(Size.class); ImageReader mockImageReader = mock(ImageReader.class); - TestUtils.setPrivateField(camera, "recordingVideo", false); - TestUtils.setPrivateField(camera, "pictureImageReader", mockImageReader); + camera.recordingVideo = false; + camera.pictureImageReader = mockImageReader; CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + camera.cameraDevice = fakeCamera; - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = - (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = (ResolutionFeature) TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); @@ -740,16 +739,15 @@ public void startPreview_shouldFlipRotation() throws InterruptedException, Camer mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); Size mockSize = mock(Size.class); - TestUtils.setPrivateField(camera, "recordingVideo", true); - TestUtils.setPrivateField(camera, "videoRenderer", mockVideoRenderer); - TestUtils.setPrivateField(camera, "initialCameraFacing", CameraMetadata.LENS_FACING_BACK); + camera.recordingVideo = true; + camera.videoRenderer = mockVideoRenderer; + camera.initialCameraFacing = CameraMetadata.LENS_FACING_BACK; CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + camera.cameraDevice = fakeCamera; ImageReader mockPictureImageReader = mock(ImageReader.class); - TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); + camera.pictureImageReader = mockPictureImageReader; - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = - (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = (ResolutionFeature) TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); @@ -771,14 +769,13 @@ public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() Size mockSize = mock(Size.class); ImageReader mockPictureImageReader = mock(ImageReader.class); ImageStreamReader mockImageStreamReader = mock(ImageStreamReader.class); - TestUtils.setPrivateField(camera, "recordingVideo", false); - TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); + camera.recordingVideo = false; + camera.pictureImageReader = mockPictureImageReader; CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + camera.cameraDevice = fakeCamera; camera.imageStreamReader = mockImageStreamReader; - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = - (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = (ResolutionFeature) TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); @@ -798,7 +795,7 @@ public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() @Test public void setDescriptionWhileRecording_shouldErrorWhenNotRecording() { MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - TestUtils.setPrivateField(camera, "recordingVideo", false); + camera.recordingVideo = false; final CameraProperties newCameraProperties = mock(CameraProperties.class); camera.setDescriptionWhileRecording(mockResult, newCameraProperties); @@ -810,7 +807,7 @@ public void setDescriptionWhileRecording_shouldErrorWhenNotRecording() { @Test public void resumeVideoRecording_shouldSendVideoRecordingFailedErrorWhenVersionCodeSmallerThanN() { - TestUtils.setPrivateField(camera, "recordingVideo", true); + camera.recordingVideo = true; SdkCapabilityChecker.SDK_VERSION = 23; MethodChannel.Result mockResult = mock(MethodChannel.Result.class); @@ -826,8 +823,8 @@ public void setDescriptionWhileRecording_shouldErrorWhenNotRecording() { public void resumeVideoRecording_shouldSendVideoRecordingFailedErrorWhenMediaRecorderPauseThrowsIllegalStateException() { MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(camera, "recordingVideo", true); + camera.mediaRecorder = mockMediaRecorder; + camera.recordingVideo = true; SdkCapabilityChecker.SDK_VERSION = 24; IllegalStateException expectedException = new IllegalStateException("Test error message"); @@ -877,7 +874,7 @@ public void setFocusMode_shouldUnlockAutoFocusForAutoMode() { @Test public void setFocusMode_shouldSkipUnlockAutoFocusWhenNullCaptureSession() { - TestUtils.setPrivateField(camera, "captureSession", null); + camera.captureSession = null; camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); verify(mockPreviewRequestBuilder, never()) .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); @@ -904,16 +901,14 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader Size mockSize = mock(Size.class); MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); ImageReader mockPictureImageReader = mock(ImageReader.class); - TestUtils.setPrivateField(cameraSpy, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(cameraSpy, "recordingVideo", false); - TestUtils.setPrivateField(cameraSpy, "pictureImageReader", mockPictureImageReader); + cameraSpy.mediaRecorder = mockMediaRecorder; + cameraSpy.recordingVideo = false; + cameraSpy.pictureImageReader = mockPictureImageReader; CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - TestUtils.setPrivateField(cameraSpy, "cameraDevice", fakeCamera); + cameraSpy.cameraDevice = fakeCamera; MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = - (TextureRegistry.SurfaceTextureEntry) - TestUtils.getPrivateField(cameraSpy, "flutterTexture"); + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = cameraSpy.flutterTexture; ResolutionFeature resolutionFeature = (ResolutionFeature) TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); @@ -942,7 +937,7 @@ public void setFocusMode_shouldLockAutoFocusForLockedMode() throws CameraAccessE @Test public void setFocusMode_shouldSkipLockAutoFocusWhenNullCaptureSession() { - TestUtils.setPrivateField(camera, "captureSession", null); + camera.captureSession = null; camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); verify(mockPreviewRequestBuilder, never()) .set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START); @@ -1040,7 +1035,7 @@ public void unlockCaptureOrientation_shouldUnlockCaptureOrientation() { public void pausePreview_shouldPausePreview() throws CameraAccessException { camera.pausePreview(); - assertEquals(TestUtils.getPrivateField(camera, "pausedPreview"), true); + camera.pausedPreview = true; verify(mockCaptureSession, times(1)).stopRepeating(); } @@ -1048,7 +1043,7 @@ public void pausePreview_shouldPausePreview() throws CameraAccessException { public void resumePreview_shouldResumePreview() throws CameraAccessException { camera.resumePreview(); - assertEquals(TestUtils.getPrivateField(camera, "pausedPreview"), false); + camera.pausedPreview = false; verify(mockCaptureSession, times(1)).setRepeatingRequest(any(), any(), any()); } @@ -1068,7 +1063,7 @@ public void startBackgroundThread_shouldStartNewThread() { camera.startBackgroundThread(); verify(mockHandlerThread, times(1)).start(); - assertEquals(mockHandler, TestUtils.getPrivateField(camera, "backgroundHandler")); + assertEquals(mockHandler, camera.backgroundHandler); } @Test @@ -1094,8 +1089,8 @@ public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAc mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); // Stub out other features used by the flow. - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); - TestUtils.setPrivateField(camera, "pictureImageReader", mock(ImageReader.class)); + camera.cameraDevice = fakeCamera; + camera.pictureImageReader = mock(ImageReader.class); SensorOrientationFeature mockSensorOrientationFeature = mockCameraFeatureFactory.createSensorOrientationFeature(mockCameraProperties, null, null); DeviceOrientationManager mockDeviceOrientationManager = mock(DeviceOrientationManager.class); @@ -1120,12 +1115,10 @@ public void createCaptureSession_doesNotCloseCaptureSession() throws CameraAcces ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + camera.cameraDevice = fakeCamera; - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = - (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); - CameraFeatures cameraFeatures = - (CameraFeatures) TestUtils.getPrivateField(camera, "cameraFeatures"); + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; + CameraFeatures cameraFeatures = camera.cameraFeatures; ResolutionFeature resolutionFeature = (ResolutionFeature) TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); @@ -1150,14 +1143,12 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); CameraDeviceWrapper fakeCamera = spy(new FakeCameraDeviceWrapper(mockRequestBuilders)); ImageReader mockPictureImageReader = mock(ImageReader.class); - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); - TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); + camera.cameraDevice = fakeCamera; + camera.pictureImageReader = mockPictureImageReader; CaptureRequest.Builder mockPreviewRequestBuilder = mock(CaptureRequest.Builder.class); - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = - (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); - CameraFeatures cameraFeatures = - (CameraFeatures) TestUtils.getPrivateField(camera, "cameraFeatures"); + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; + CameraFeatures cameraFeatures = camera.cameraFeatures; ResolutionFeature resolutionFeature = (ResolutionFeature) TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); @@ -1189,7 +1180,7 @@ public void close_doesNotCloseCaptureSessionWhenCameraDeviceNonNull() { ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + camera.cameraDevice = fakeCamera; camera.close(); @@ -1264,8 +1255,8 @@ public void startVideoRecording_shouldApplySettingsToMediaRecorder() when(mockSensorOrientationFeature.getDeviceOrientationManager()) .thenReturn(mockDeviceOrientationManager); - TestUtils.setPrivateField(camera, "captureSession", mockCaptureSession); - TestUtils.setPrivateField(camera, "previewRequestBuilder", mockPreviewRequestBuilder); + camera.captureSession = mockCaptureSession; + camera.previewRequestBuilder = mockPreviewRequestBuilder; final ArrayList mockRequestBuilders = new ArrayList<>(); CaptureRequest.Builder mockRequestBuilder = mock(CaptureRequest.Builder.class); @@ -1273,15 +1264,14 @@ public void startVideoRecording_shouldApplySettingsToMediaRecorder() final SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); final Size mockSize = mock(Size.class); final ImageReader mockPictureImageReader = mock(ImageReader.class); - TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); + camera.pictureImageReader = mockPictureImageReader; final CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders, mockCaptureSession); - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + camera.cameraDevice = fakeCamera; MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = - (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = (ResolutionFeature) @@ -1306,8 +1296,7 @@ public void startVideoRecording_shouldApplySettingsToMediaRecorder() (Range range) -> range.getLower() == fps && range.getUpper() == fps)); //endregion - final MediaRecorder recorder = - (MediaRecorder) TestUtils.getPrivateField(camera, "mediaRecorder"); + final MediaRecorder recorder = camera.mediaRecorder; //region Check that parameters affects movies, written by MediaRecorder. verify(recorder).setVideoFrameRate(fps); @@ -1322,7 +1311,7 @@ public void pausePreview_doesNotCallStopRepeatingWhenCameraClosed() throws Camer ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + camera.cameraDevice = fakeCamera; camera.close(); camera.pausePreview(); From 7be36cb104de763c11d4776f87b039e3e3c21ba3 Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Mon, 8 Apr 2024 15:25:24 -0700 Subject: [PATCH 2/6] remove from methodcallhandlerimpltest --- .../io/flutter/plugins/camera/MethodCallHandlerImpl.java | 5 ++++- .../io/flutter/plugins/camera/MethodCallHandlerImplTest.java | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java index 19b16e8f7bf..306756738c7 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java @@ -10,6 +10,8 @@ import android.os.Looper; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; + import io.flutter.embedding.engine.systemchannels.PlatformChannel; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.EventChannel; @@ -36,7 +38,8 @@ final class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler { private final TextureRegistry textureRegistry; private final MethodChannel methodChannel; private final EventChannel imageStreamChannel; - private @Nullable Camera camera; + @VisibleForTesting + @Nullable Camera camera; MethodCallHandlerImpl( Activity activity, diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/MethodCallHandlerImplTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/MethodCallHandlerImplTest.java index 868e2e9e6d5..58637b40e74 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/MethodCallHandlerImplTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/MethodCallHandlerImplTest.java @@ -23,7 +23,7 @@ public class MethodCallHandlerImplTest { - MethodChannel.MethodCallHandler handler; + MethodCallHandlerImpl handler; MethodChannel.Result mockResult; Camera mockCamera; @@ -38,7 +38,7 @@ public void setUp() { mock(TextureRegistry.class)); mockResult = mock(MethodChannel.Result.class); mockCamera = mock(Camera.class); - TestUtils.setPrivateField(handler, "camera", mockCamera); + handler.camera = mockCamera; } @Test From ad2de44ea2393afddd7b9f0f335cc13567b93cb0 Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Mon, 8 Apr 2024 15:26:05 -0700 Subject: [PATCH 3/6] delete forgotten unused import --- .../io/flutter/plugins/camera/MethodCallHandlerImplTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/MethodCallHandlerImplTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/MethodCallHandlerImplTest.java index 58637b40e74..e4ab82d9eda 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/MethodCallHandlerImplTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/MethodCallHandlerImplTest.java @@ -16,7 +16,6 @@ import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugins.camera.utils.TestUtils; import io.flutter.view.TextureRegistry; import org.junit.Before; import org.junit.Test; From 226138ff34f79b7222a1172cb8eff6b4587d231a Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Mon, 8 Apr 2024 15:31:42 -0700 Subject: [PATCH 4/6] finish deletion --- .../io/flutter/plugins/camera/CameraTest.java | 36 +++++-------------- .../plugins/camera/utils/TestUtils.java | 31 ---------------- 2 files changed, 9 insertions(+), 58 deletions(-) delete mode 100644 packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/utils/TestUtils.java diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 081edef93c2..d2d90b7beca 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -27,7 +27,6 @@ import android.view.Surface; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; import androidx.lifecycle.LifecycleObserver; import io.flutter.embedding.engine.systemchannels.PlatformChannel; import io.flutter.plugin.common.EventChannel; @@ -52,7 +51,6 @@ import io.flutter.plugins.camera.features.sensororientation.SensorOrientationFeature; import io.flutter.plugins.camera.features.zoomlevel.ZoomLevelFeature; import io.flutter.plugins.camera.media.ImageStreamReader; -import io.flutter.plugins.camera.utils.TestUtils; import io.flutter.view.TextureRegistry; import java.io.Closeable; import java.io.File; @@ -111,7 +109,7 @@ public void close() {} public class CameraTest { private CameraProperties mockCameraProperties; - private CameraFeatureFactory mockCameraFeatureFactory; + private TestCameraFeatureFactory mockCameraFeatureFactory; private DartMessenger mockDartMessenger; private Camera camera; private CameraCaptureSession mockCaptureSession; @@ -693,9 +691,7 @@ public void startPreview_shouldPullStreamFromVideoRenderer() camera.pictureImageReader = mockPictureImageReader; TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; - ResolutionFeature resolutionFeature = - (ResolutionFeature) - TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); @@ -719,9 +715,7 @@ public void startPreview_shouldPullStreamFromImageReader() camera.cameraDevice = fakeCamera; TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; - ResolutionFeature resolutionFeature = - (ResolutionFeature) - TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); @@ -748,9 +742,7 @@ public void startPreview_shouldFlipRotation() throws InterruptedException, Camer camera.pictureImageReader = mockPictureImageReader; TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; - ResolutionFeature resolutionFeature = - (ResolutionFeature) - TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); @@ -776,9 +768,7 @@ public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() camera.imageStreamReader = mockImageStreamReader; TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; - ResolutionFeature resolutionFeature = - (ResolutionFeature) - TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); @@ -909,9 +899,7 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader MethodChannel.Result mockResult = mock(MethodChannel.Result.class); TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = cameraSpy.flutterTexture; - ResolutionFeature resolutionFeature = - (ResolutionFeature) - TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); @@ -1119,9 +1107,7 @@ public void createCaptureSession_doesNotCloseCaptureSession() throws CameraAcces TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; CameraFeatures cameraFeatures = camera.cameraFeatures; - ResolutionFeature resolutionFeature = - (ResolutionFeature) - TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); @@ -1149,9 +1135,7 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; CameraFeatures cameraFeatures = camera.cameraFeatures; - ResolutionFeature resolutionFeature = - (ResolutionFeature) - TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); @@ -1273,9 +1257,7 @@ public void startVideoRecording_shouldApplySettingsToMediaRecorder() TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; - ResolutionFeature resolutionFeature = - (ResolutionFeature) - TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; assertNotNull(cameraFlutterTexture); when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/utils/TestUtils.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/utils/TestUtils.java deleted file mode 100644 index 79911a0b0b5..00000000000 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/utils/TestUtils.java +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.camera.utils; - -import java.lang.reflect.Field; -import org.junit.Assert; - -public class TestUtils { - public static void setPrivateField(T instance, String fieldName, Object newValue) { - try { - Field field = instance.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - field.set(instance, newValue); - } catch (Exception e) { - Assert.fail("Unable to mock private field: " + fieldName); - } - } - - public static Object getPrivateField(T instance, String fieldName) { - try { - Field field = instance.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - return field.get(instance); - } catch (Exception e) { - Assert.fail("Unable to mock private field: " + fieldName); - return null; - } - } -} From fc63e2cb0a158eb61ff06700aa3cfcd4b9868b6d Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Mon, 8 Apr 2024 15:59:10 -0700 Subject: [PATCH 5/6] changelog and pubspec --- packages/camera/camera_android/CHANGELOG.md | 4 ++++ packages/camera/camera_android/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index 01dab3badc0..66cd2dc329e 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.9+1 + +* Changes the visibility of a number of fields to `@VisibleForTesting` in order simplify testing. + ## 0.10.9 * Adds support to control video FPS and bitrate. See `CameraController.withSettings`. diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 6446f3c7e8d..06958bbd322 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.9 +version: 0.10.9+1 environment: sdk: ^3.1.0 From cf4a1ae2028db168dfd1311351b913b7d6ae9d48 Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Mon, 8 Apr 2024 16:09:01 -0700 Subject: [PATCH 6/6] format --- .../java/io/flutter/plugins/camera/Camera.java | 18 ++++++------------ .../plugins/camera/MethodCallHandlerImpl.java | 4 +--- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java index e56c5504726..7668ec97eec 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -105,18 +105,15 @@ class Camera * Takes an input/output surface and orients the recording correctly. This is needed because * switching cameras while recording causes the wrong orientation. */ - @VisibleForTesting - VideoRenderer videoRenderer; + @VisibleForTesting VideoRenderer videoRenderer; /** * Whether or not the camera aligns with the initial way the camera was facing if the camera was * flipped. */ - @VisibleForTesting - int initialCameraFacing; + @VisibleForTesting int initialCameraFacing; - @VisibleForTesting - final SurfaceTextureEntry flutterTexture; + @VisibleForTesting final SurfaceTextureEntry flutterTexture; private final VideoCaptureSettings videoCaptureSettings; private final Context applicationContext; final DartMessenger dartMessenger; @@ -133,19 +130,16 @@ class Camera CameraDeviceWrapper cameraDevice; CameraCaptureSession captureSession; - @VisibleForTesting - ImageReader pictureImageReader; + @VisibleForTesting ImageReader pictureImageReader; ImageStreamReader imageStreamReader; /** {@link CaptureRequest.Builder} for the camera preview */ CaptureRequest.Builder previewRequestBuilder; - @VisibleForTesting - MediaRecorder mediaRecorder; + @VisibleForTesting MediaRecorder mediaRecorder; /** True when recording video. */ boolean recordingVideo; /** True when the preview is paused. */ - @VisibleForTesting - boolean pausedPreview; + @VisibleForTesting boolean pausedPreview; private File captureFile; diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java index 306756738c7..eae8c650fe6 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java @@ -11,7 +11,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; - import io.flutter.embedding.engine.systemchannels.PlatformChannel; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.EventChannel; @@ -38,8 +37,7 @@ final class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler { private final TextureRegistry textureRegistry; private final MethodChannel methodChannel; private final EventChannel imageStreamChannel; - @VisibleForTesting - @Nullable Camera camera; + @VisibleForTesting @Nullable Camera camera; MethodCallHandlerImpl( Activity activity,