diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index dbf3789b43a7..102fe72726be 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.9+4 + +* [Supports Impeller](https://docs.flutter.dev/release/breaking-changes/android-surface-plugins). + ## 0.10.9+3 * Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. @@ -36,7 +40,7 @@ ## 0.10.8+14 -* Fixes `pausePreview` null pointer error. `pausePreview` should not be called +* Fixes `pausePreview` null pointer error. `pausePreview` should not be called when camera is closed or not configured. * Updates minimum supported SDK version to Flutter 3.10/Dart 3.0. 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 7668ec97eec7..52c5e59f1815 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 @@ -9,7 +9,6 @@ import android.app.Activity; import android.content.Context; import android.graphics.ImageFormat; -import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraDevice; @@ -63,7 +62,7 @@ import io.flutter.plugins.camera.media.MediaRecorderBuilder; import io.flutter.plugins.camera.types.CameraCaptureProperties; import io.flutter.plugins.camera.types.CaptureTimeoutsWrapper; -import io.flutter.view.TextureRegistry.SurfaceTextureEntry; +import io.flutter.view.TextureRegistry; import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -113,7 +112,7 @@ class Camera */ @VisibleForTesting int initialCameraFacing; - @VisibleForTesting final SurfaceTextureEntry flutterTexture; + @VisibleForTesting final TextureRegistry.SurfaceProducer surfaceProducer; private final VideoCaptureSettings videoCaptureSettings; private final Context applicationContext; final DartMessenger dartMessenger; @@ -214,17 +213,16 @@ public VideoCaptureSettings(@NonNull ResolutionPreset resolutionPreset, boolean public Camera( final Activity activity, - final SurfaceTextureEntry flutterTexture, + final TextureRegistry.SurfaceProducer surfaceProducer, final CameraFeatureFactory cameraFeatureFactory, final DartMessenger dartMessenger, final CameraProperties cameraProperties, final VideoCaptureSettings videoCaptureSettings) { - if (activity == null) { throw new IllegalStateException("No activity available!"); } this.activity = activity; - this.flutterTexture = flutterTexture; + this.surfaceProducer = surfaceProducer; this.dartMessenger = dartMessenger; this.applicationContext = activity.getApplicationContext(); this.cameraProperties = cameraProperties; @@ -243,7 +241,6 @@ public Camera( if (videoCaptureSettings.fps != null && videoCaptureSettings.fps.intValue() > 0) { recordingFps = videoCaptureSettings.fps; } else { - if (SdkCapabilityChecker.supportsEncoderProfiles()) { EncoderProfiles encoderProfiles = getRecordingProfile(); if (encoderProfiles != null && encoderProfiles.getVideoProfiles().size() > 0) { @@ -256,7 +253,6 @@ public Camera( } if (recordingFps != null && recordingFps.intValue() > 0) { - final FpsRangeFeature fpsRange = new FpsRangeFeature(cameraProperties); fpsRange.setValue(new Range(recordingFps, recordingFps)); this.cameraFeatures.setFpsRange(fpsRange); @@ -307,8 +303,9 @@ private void prepareMediaRecorder(String outputFilePath) throws IOException { MediaRecorderBuilder mediaRecorderBuilder; - // TODO(camsim99): Revert changes that allow legacy code to be used when recordingProfile is null - // once this has largely been fixed on the Android side. https://github.com/flutter/flutter/issues/119668 + // TODO(camsim99): Revert changes that allow legacy code to be used when recordingProfile is + // null once this has largely been fixed on the Android side. + // https://github.com/flutter/flutter/issues/119668 if (SdkCapabilityChecker.supportsEncoderProfiles() && getRecordingProfile() != null) { mediaRecorderBuilder = new MediaRecorderBuilder( @@ -386,7 +383,8 @@ public void onOpened(@NonNull CameraDevice device) { cameraDevice = new DefaultCameraDeviceWrapper(device); try { startPreview(); - if (!recordingVideo) { // only send initialization if we werent already recording and switching cameras + if (!recordingVideo) { // only send initialization if we werent already recording and + // switching cameras dartMessenger.sendCameraInitializedEvent( resolutionFeature.getPreviewSize().getWidth(), resolutionFeature.getPreviewSize().getHeight(), @@ -470,11 +468,10 @@ private void createCaptureSession( // Build Flutter surface to render to. ResolutionFeature resolutionFeature = cameraFeatures.getResolution(); - SurfaceTexture surfaceTexture = flutterTexture.surfaceTexture(); - surfaceTexture.setDefaultBufferSize( + surfaceProducer.setSize( resolutionFeature.getPreviewSize().getWidth(), resolutionFeature.getPreviewSize().getHeight()); - Surface flutterSurface = new Surface(surfaceTexture); + Surface flutterSurface = surfaceProducer.getSurface(); previewRequestBuilder.addTarget(flutterSurface); List remainingSurfaces = Arrays.asList(surfaces); @@ -1160,7 +1157,8 @@ public void resumePreview() { } public void startPreview() throws CameraAccessException, InterruptedException { - // If recording is already in progress, the camera is being flipped, so send it through the VideoRenderer to keep the correct orientation. + // If recording is already in progress, the camera is being flipped, so send it through the + // VideoRenderer to keep the correct orientation. if (recordingVideo) { startPreviewWithVideoRendererStream(); } else { @@ -1193,7 +1191,6 @@ private void startPreviewWithVideoRendererStream() } if (cameraProperties.getLensFacing() != initialCameraFacing) { - // If the new camera is facing the opposite way than the initial recording, // the rotation should be flipped 180 degrees. rotation = (rotation + 180) % 360; @@ -1361,13 +1358,13 @@ public void uncaughtException(Thread thread, Throwable ex) { public void setDescriptionWhileRecording( @NonNull final Result result, CameraProperties properties) { - if (!recordingVideo) { result.error("setDescriptionWhileRecordingFailed", "Device was not recording", null); return; } - // See VideoRenderer.java; support for this EGL extension is required to switch camera while recording. + // See VideoRenderer.java; support for this EGL extension is required to switch camera while + // recording. if (!SdkCapabilityChecker.supportsEglRecordableAndroid()) { result.error( "setDescriptionWhileRecordingFailed", @@ -1400,7 +1397,7 @@ public void dispose() { Log.i(TAG, "dispose"); close(); - flutterTexture.release(); + surfaceProducer.release(); getDeviceOrientationManager().stop(); } 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 eae8c650fe60..b3f4da808688 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 @@ -393,11 +393,9 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce Integer videoBitrate = call.argument("videoBitrate"); Integer audioBitrate = call.argument("audioBitrate"); - TextureRegistry.SurfaceTextureEntry flutterSurfaceTexture = - textureRegistry.createSurfaceTexture(); + TextureRegistry.SurfaceProducer surfaceProducer = textureRegistry.createSurfaceProducer(); DartMessenger dartMessenger = - new DartMessenger( - messenger, flutterSurfaceTexture.id(), new Handler(Looper.getMainLooper())); + new DartMessenger(messenger, surfaceProducer.id(), new Handler(Looper.getMainLooper())); CameraProperties cameraProperties = new CameraPropertiesImpl(cameraName, CameraUtils.getCameraManager(activity)); ResolutionPreset resolutionPreset = ResolutionPreset.valueOf(preset); @@ -405,7 +403,7 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce camera = new Camera( activity, - flutterSurfaceTexture, + surfaceProducer, new CameraFeatureFactoryImpl(), dartMessenger, cameraProperties, @@ -413,7 +411,7 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce resolutionPreset, enableAudio, fps, videoBitrate, audioBitrate)); Map reply = new HashMap<>(); - reply.put("cameraId", flutterSurfaceTexture.id()); + reply.put("cameraId", surfaceProducer.id()); result.success(reply); } 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 d2d90b7beca6..976380851cae 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 @@ -32,7 +32,6 @@ import io.flutter.plugin.common.EventChannel; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugins.camera.features.CameraFeatureFactory; -import io.flutter.plugins.camera.features.CameraFeatures; import io.flutter.plugins.camera.features.Point; import io.flutter.plugins.camera.features.autofocus.AutoFocusFeature; import io.flutter.plugins.camera.features.autofocus.FocusMode; @@ -123,7 +122,6 @@ public class CameraTest { @Before public void before() { - mockRangeConstruction = new RangeConstruction(); mockCameraProperties = mock(CameraProperties.class); mockDartMessenger = mock(DartMessenger.class); @@ -135,8 +133,8 @@ public void before() { mockHandler = mock(Handler.class); final Activity mockActivity = mock(Activity.class); - final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = - mock(TextureRegistry.SurfaceTextureEntry.class); + final TextureRegistry.SurfaceProducer mockSurfaceProducer = + mock(TextureRegistry.SurfaceProducer.class); final String cameraName = "1"; final ResolutionPreset resolutionPreset = ResolutionPreset.high; final boolean enableAudio = false; @@ -163,7 +161,7 @@ public void before() { camera = new Camera( mockActivity, - mockFlutterTexture, + mockSurfaceProducer, mockCameraFeatureFactory, mockDartMessenger, mockCameraProperties, @@ -195,8 +193,8 @@ public void shouldNotImplementLifecycleObserverInterface() { @Test public void shouldCreateCameraPluginAndSetAllFeatures() { final Activity mockActivity = mock(Activity.class); - final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = - mock(TextureRegistry.SurfaceTextureEntry.class); + final TextureRegistry.SurfaceProducer mockSurfaceProducer = + mock(TextureRegistry.SurfaceProducer.class); final CameraFeatureFactory spyMockCameraFeatureFactory = spy(mockCameraFeatureFactory); final String cameraName = "1"; final ResolutionPreset resolutionPreset = ResolutionPreset.high; @@ -210,7 +208,7 @@ public void shouldCreateCameraPluginAndSetAllFeatures() { Camera camera = new Camera( mockActivity, - mockFlutterTexture, + mockSurfaceProducer, spyMockCameraFeatureFactory, mockDartMessenger, mockCameraProperties, @@ -681,7 +679,6 @@ public void startPreview_shouldPullStreamFromVideoRenderer() VideoRenderer mockVideoRenderer = mock(VideoRenderer.class); ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); - SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); Size mockSize = mock(Size.class); camera.recordingVideo = true; camera.videoRenderer = mockVideoRenderer; @@ -690,10 +687,8 @@ public void startPreview_shouldPullStreamFromVideoRenderer() ImageReader mockPictureImageReader = mock(ImageReader.class); camera.pictureImageReader = mockPictureImageReader; - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; - when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); camera.startPreview(); @@ -706,7 +701,6 @@ public void startPreview_shouldPullStreamFromImageReader() throws InterruptedException, CameraAccessException { ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); - SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); Size mockSize = mock(Size.class); ImageReader mockImageReader = mock(ImageReader.class); camera.recordingVideo = false; @@ -714,10 +708,8 @@ public void startPreview_shouldPullStreamFromImageReader() CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); camera.cameraDevice = fakeCamera; - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; - when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); @@ -731,7 +723,6 @@ public void startPreview_shouldFlipRotation() throws InterruptedException, Camer VideoRenderer mockVideoRenderer = mock(VideoRenderer.class); ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); - SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); Size mockSize = mock(Size.class); camera.recordingVideo = true; camera.videoRenderer = mockVideoRenderer; @@ -741,10 +732,8 @@ public void startPreview_shouldFlipRotation() throws InterruptedException, Camer ImageReader mockPictureImageReader = mock(ImageReader.class); camera.pictureImageReader = mockPictureImageReader; - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; - when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(mockCameraProperties.getLensFacing()).thenReturn(CameraMetadata.LENS_FACING_FRONT); @@ -767,10 +756,8 @@ public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() camera.cameraDevice = fakeCamera; camera.imageStreamReader = mockImageStreamReader; - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; - when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); camera.startPreviewWithImageStream(mock(EventChannel.class)); @@ -887,7 +874,6 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader Camera cameraSpy = spy(camera); ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); - SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); Size mockSize = mock(Size.class); MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); ImageReader mockPictureImageReader = mock(ImageReader.class); @@ -898,10 +884,8 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader cameraSpy.cameraDevice = fakeCamera; MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = cameraSpy.flutterTexture; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; - when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); doNothing().when(cameraSpy).prepareRecording(mockResult); @@ -1089,7 +1073,8 @@ public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAc camera.onConverged(); // A picture should be taken. verify(mockCaptureSession, times(1)).capture(any(), any(), any()); - // The session shuold not be aborted as part of this flow, as this breaks capture on some + // The session shuold not be aborted as part of this flow, as this breaks + // capture on some // devices, and causes delays on others. verify(mockCaptureSession, never()).abortCaptures(); } @@ -1097,19 +1082,14 @@ public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAc @Test public void createCaptureSession_doesNotCloseCaptureSession() throws CameraAccessException { Surface mockSurface = mock(Surface.class); - SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); - ResolutionFeature mockResolutionFeature = mock(ResolutionFeature.class); Size mockSize = mock(Size.class); ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); camera.cameraDevice = fakeCamera; - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; - CameraFeatures cameraFeatures = camera.cameraFeatures; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; - when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); camera.createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, mockSurface); @@ -1122,8 +1102,6 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest throws CameraAccessException { Surface mockSurface = mock(Surface.class); Surface mockSecondarySurface = mock(Surface.class); - SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); - ResolutionFeature mockResolutionFeature = mock(ResolutionFeature.class); Size mockSize = mock(Size.class); ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); @@ -1133,11 +1111,8 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest camera.pictureImageReader = mockPictureImageReader; CaptureRequest.Builder mockPreviewRequestBuilder = mock(CaptureRequest.Builder.class); - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; - CameraFeatures cameraFeatures = camera.cameraFeatures; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; - when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(fakeCamera.createCaptureRequest(anyInt())).thenReturn(mockPreviewRequestBuilder); when(mockPictureImageReader.getSurface()).thenReturn(mockSurface); @@ -1174,19 +1149,18 @@ public void close_doesNotCloseCaptureSessionWhenCameraDeviceNonNull() { @Test public void startVideoRecording_shouldApplySettingsToMediaRecorder() throws InterruptedException, IOException, CameraAccessException { - final Activity mockActivity = mock(Activity.class); - final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = - mock(TextureRegistry.SurfaceTextureEntry.class); + final TextureRegistry.SurfaceProducer mockSurfaceProducer = + mock(TextureRegistry.SurfaceProducer.class); final String cameraName = "1"; final ResolutionPreset resolutionPreset = ResolutionPreset.high; final boolean enableAudio = true; - //region These parameters should be set in android MediaRecorder. + // region These parameters should be set in android MediaRecorder. final int fps = 15; final int videoBitrate = 200000; final int audioBitrate = 32000; - //endregion + // endregion when(mockCameraProperties.getCameraName()).thenReturn(cameraName); @@ -1209,7 +1183,6 @@ public void startVideoRecording_shouldApplySettingsToMediaRecorder() try (final MockedStatic mockFile = mockStatic(File.class); final MockedConstruction mockMediaRecorder = Mockito.mockConstruction(MediaRecorder.class)) { - assertNotNull(mockMediaRecorder); mockFile @@ -1222,7 +1195,7 @@ public void startVideoRecording_shouldApplySettingsToMediaRecorder() spy( new Camera( mockActivity, - mockFlutterTexture, + mockSurfaceProducer, mockCameraFeatureFactory, mockDartMessenger, mockCameraProperties, @@ -1255,19 +1228,15 @@ public void startVideoRecording_shouldApplySettingsToMediaRecorder() camera.cameraDevice = fakeCamera; MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; - ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; - assertNotNull(cameraFlutterTexture); - when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); - assertNotNull(resolutionFeature); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); camera.startVideoRecording(mockResult, null); - //region Check that FPS parameter affects AE range at which the camera captures frames. + // region Check that FPS parameter affects AE range at which the camera captures + // frames. assertEquals(camera.cameraFeatures.getFpsRange().getValue().getLower(), Integer.valueOf(fps)); assertEquals(camera.cameraFeatures.getFpsRange().getValue().getUpper(), Integer.valueOf(fps)); @@ -1276,15 +1245,15 @@ public void startVideoRecording_shouldApplySettingsToMediaRecorder() eq(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE), argThat( (Range range) -> range.getLower() == fps && range.getUpper() == fps)); - //endregion + // endregion final MediaRecorder recorder = camera.mediaRecorder; - //region Check that parameters affects movies, written by MediaRecorder. + // region Check that parameters affects movies, written by MediaRecorder. verify(recorder).setVideoFrameRate(fps); verify(recorder).setAudioEncodingBitRate(audioBitrate); verify(recorder).setVideoEncodingBitRate(videoBitrate); - //endregion + // endregion } } diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest_getRecordingProfileTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest_getRecordingProfileTest.java index c5a97a19aca7..8791ecdcff9f 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest_getRecordingProfileTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest_getRecordingProfileTest.java @@ -60,15 +60,15 @@ public void before() { mockDartMessenger = mock(DartMessenger.class); final Activity mockActivity = mock(Activity.class); - final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = - mock(TextureRegistry.SurfaceTextureEntry.class); + final TextureRegistry.SurfaceProducer mockSurfaceProducer = + mock(TextureRegistry.SurfaceProducer.class); final ResolutionPreset resolutionPreset = ResolutionPreset.high; final boolean enableAudio = false; camera = new Camera( mockActivity, - mockFlutterTexture, + mockSurfaceProducer, mockCameraFeatureFactory, mockDartMessenger, mockCameraProperties, diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 704f64b4f71a..f5b21d677c03 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+3 +version: 0.10.9+4 environment: sdk: ^3.4.0