From 0b250c20b1f8c33d436440cac12e2284bf55cff3 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 30 May 2024 11:38:27 -0700 Subject: [PATCH 1/3] Revert "Migrate CameraX from SurfaceTexture to SurfaceProducer. (#6462)" This reverts commit 47d5eb2073907b90189255407fd94845abca1ae5. --- .../camera_android_camerax/CHANGELOG.md | 4 -- .../flutter/plugins/camerax/CameraXProxy.java | 7 ++++ .../plugins/camerax/PreviewHostApiImpl.java | 20 +++++----- .../flutter/plugins/camerax/PreviewTest.java | 38 +++++++++---------- .../camera_android_camerax/pubspec.yaml | 2 +- 5 files changed, 38 insertions(+), 33 deletions(-) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 2215374e4ba1..b35e29c9659e 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,7 +1,3 @@ -## 0.6.5+4 - -* [Supports Impeller](https://docs.flutter.dev/release/breaking-changes/android-surface-plugins). - ## 0.6.5+3 * Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXProxy.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXProxy.java index e749940200a6..af7fdc36a721 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXProxy.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXProxy.java @@ -5,7 +5,9 @@ package io.flutter.plugins.camerax; import android.app.Activity; +import android.graphics.SurfaceTexture; import android.util.Size; +import android.view.Surface; import androidx.annotation.NonNull; import androidx.camera.core.CameraSelector; import androidx.camera.core.ImageAnalysis; @@ -49,6 +51,11 @@ public class CameraXProxy { return new Preview.Builder(); } + /** Creates a {@link Surface} instance from the specified {@link SurfaceTexture}. */ + public @NonNull Surface createSurface(@NonNull SurfaceTexture surfaceTexture) { + return new Surface(surfaceTexture); + } + /** * Creates an instance of the {@link SystemServicesFlutterApiImpl}. * diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/PreviewHostApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/PreviewHostApiImpl.java index e2dd18b81dc1..7b1ba1214cdb 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/PreviewHostApiImpl.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/PreviewHostApiImpl.java @@ -4,6 +4,7 @@ package io.flutter.plugins.camerax; +import android.graphics.SurfaceTexture; import android.util.Size; import android.view.Surface; import androidx.annotation.NonNull; @@ -24,7 +25,7 @@ public class PreviewHostApiImpl implements PreviewHostApi { private final TextureRegistry textureRegistry; @VisibleForTesting public @NonNull CameraXProxy cameraXProxy = new CameraXProxy(); - @VisibleForTesting public @Nullable TextureRegistry.SurfaceProducer flutterSurfaceProducer; + @VisibleForTesting public @Nullable TextureRegistry.SurfaceTextureEntry flutterSurfaceTexture; public PreviewHostApiImpl( @NonNull BinaryMessenger binaryMessenger, @@ -61,11 +62,12 @@ public void create( @Override public @NonNull Long setSurfaceProvider(@NonNull Long identifier) { Preview preview = getPreviewInstance(identifier); - flutterSurfaceProducer = textureRegistry.createSurfaceProducer(); - Preview.SurfaceProvider surfaceProvider = createSurfaceProvider(flutterSurfaceProducer); + flutterSurfaceTexture = textureRegistry.createSurfaceTexture(); + SurfaceTexture surfaceTexture = flutterSurfaceTexture.surfaceTexture(); + Preview.SurfaceProvider surfaceProvider = createSurfaceProvider(surfaceTexture); preview.setSurfaceProvider(surfaceProvider); - return flutterSurfaceProducer.id(); + return flutterSurfaceTexture.id(); } /** @@ -74,13 +76,13 @@ public void create( */ @VisibleForTesting public @NonNull Preview.SurfaceProvider createSurfaceProvider( - @NonNull TextureRegistry.SurfaceProducer surfaceProducer) { + @NonNull SurfaceTexture surfaceTexture) { return new Preview.SurfaceProvider() { @Override public void onSurfaceRequested(@NonNull SurfaceRequest request) { - surfaceProducer.setSize( + surfaceTexture.setDefaultBufferSize( request.getResolution().getWidth(), request.getResolution().getHeight()); - Surface flutterSurface = surfaceProducer.getSurface(); + Surface flutterSurface = cameraXProxy.createSurface(surfaceTexture); request.provideSurface( flutterSurface, Executors.newSingleThreadExecutor(), @@ -131,8 +133,8 @@ String getProvideSurfaceErrorDescription(int resultCode) { */ @Override public void releaseFlutterSurfaceTexture() { - if (flutterSurfaceProducer != null) { - flutterSurfaceProducer.release(); + if (flutterSurfaceTexture != null) { + flutterSurfaceTexture.release(); } } diff --git a/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/PreviewTest.java b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/PreviewTest.java index c2ff5196ad8b..81b455d7a867 100644 --- a/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/PreviewTest.java +++ b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/PreviewTest.java @@ -13,6 +13,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.graphics.SurfaceTexture; import android.util.Size; import android.view.Surface; import androidx.camera.core.Preview; @@ -85,32 +86,34 @@ public void create_createsPreviewWithCorrectConfiguration() { public void setSurfaceProviderTest_createsSurfaceProviderAndReturnsTextureEntryId() { final PreviewHostApiImpl previewHostApi = spy(new PreviewHostApiImpl(mockBinaryMessenger, testInstanceManager, mockTextureRegistry)); - final TextureRegistry.SurfaceProducer mockSurfaceProducer = - mock(TextureRegistry.SurfaceProducer.class); + final TextureRegistry.SurfaceTextureEntry mockSurfaceTextureEntry = + mock(TextureRegistry.SurfaceTextureEntry.class); + final SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); final Long previewIdentifier = 5L; - final Long surfaceProducerEntryId = 120L; + final Long surfaceTextureEntryId = 120L; previewHostApi.cameraXProxy = mockCameraXProxy; testInstanceManager.addDartCreatedInstance(mockPreview, previewIdentifier); - when(mockTextureRegistry.createSurfaceProducer()).thenReturn(mockSurfaceProducer); - when(mockSurfaceProducer.id()).thenReturn(surfaceProducerEntryId); + when(mockTextureRegistry.createSurfaceTexture()).thenReturn(mockSurfaceTextureEntry); + when(mockSurfaceTextureEntry.surfaceTexture()).thenReturn(mockSurfaceTexture); + when(mockSurfaceTextureEntry.id()).thenReturn(surfaceTextureEntryId); final ArgumentCaptor surfaceProviderCaptor = ArgumentCaptor.forClass(Preview.SurfaceProvider.class); + final ArgumentCaptor surfaceCaptor = ArgumentCaptor.forClass(Surface.class); // Test that surface provider was set and the surface texture ID was returned. - assertEquals(previewHostApi.setSurfaceProvider(previewIdentifier), surfaceProducerEntryId); + assertEquals(previewHostApi.setSurfaceProvider(previewIdentifier), surfaceTextureEntryId); verify(mockPreview).setSurfaceProvider(surfaceProviderCaptor.capture()); - verify(previewHostApi).createSurfaceProvider(mockSurfaceProducer); + verify(previewHostApi).createSurfaceProvider(mockSurfaceTexture); } @Test public void createSurfaceProvider_createsExpectedPreviewSurfaceProvider() { final PreviewHostApiImpl previewHostApi = new PreviewHostApiImpl(mockBinaryMessenger, testInstanceManager, mockTextureRegistry); - final TextureRegistry.SurfaceProducer mockSurfaceProducer = - mock(TextureRegistry.SurfaceProducer.class); + final SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); final Surface mockSurface = mock(Surface.class); final SurfaceRequest mockSurfaceRequest = mock(SurfaceRequest.class); final SurfaceRequest.Result mockSurfaceRequestResult = mock(SurfaceRequest.Result.class); @@ -118,16 +121,13 @@ public void createSurfaceProvider_createsExpectedPreviewSurfaceProvider() { mock(SystemServicesFlutterApiImpl.class); final int resolutionWidth = 200; final int resolutionHeight = 500; - final Long surfaceProducerEntryId = 120L; previewHostApi.cameraXProxy = mockCameraXProxy; + when(mockCameraXProxy.createSurface(mockSurfaceTexture)).thenReturn(mockSurface); when(mockSurfaceRequest.getResolution()) .thenReturn(new Size(resolutionWidth, resolutionHeight)); when(mockCameraXProxy.createSystemServicesFlutterApiImpl(mockBinaryMessenger)) .thenReturn(mockSystemServicesFlutterApi); - when(mockTextureRegistry.createSurfaceProducer()).thenReturn(mockSurfaceProducer); - when(mockSurfaceProducer.id()).thenReturn(surfaceProducerEntryId); - when(mockSurfaceProducer.getSurface()).thenReturn(mockSurface); final ArgumentCaptor surfaceCaptor = ArgumentCaptor.forClass(Surface.class); @SuppressWarnings("unchecked") @@ -135,10 +135,10 @@ public void createSurfaceProvider_createsExpectedPreviewSurfaceProvider() { ArgumentCaptor.forClass(Consumer.class); Preview.SurfaceProvider previewSurfaceProvider = - previewHostApi.createSurfaceProvider(mockSurfaceProducer); + previewHostApi.createSurfaceProvider(mockSurfaceTexture); previewSurfaceProvider.onSurfaceRequested(mockSurfaceRequest); - verify(mockSurfaceProducer).setSize(resolutionWidth, resolutionHeight); + verify(mockSurfaceTexture).setDefaultBufferSize(resolutionWidth, resolutionHeight); verify(mockSurfaceRequest) .provideSurface(surfaceCaptor.capture(), any(Executor.class), consumerCaptor.capture()); @@ -189,13 +189,13 @@ public void createSurfaceProvider_createsExpectedPreviewSurfaceProvider() { public void releaseFlutterSurfaceTexture_makesCallToReleaseFlutterSurfaceTexture() { final PreviewHostApiImpl previewHostApi = new PreviewHostApiImpl(mockBinaryMessenger, testInstanceManager, mockTextureRegistry); - final TextureRegistry.SurfaceProducer mockSurfaceProducer = - mock(TextureRegistry.SurfaceProducer.class); + final TextureRegistry.SurfaceTextureEntry mockSurfaceTextureEntry = + mock(TextureRegistry.SurfaceTextureEntry.class); - previewHostApi.flutterSurfaceProducer = mockSurfaceProducer; + previewHostApi.flutterSurfaceTexture = mockSurfaceTextureEntry; previewHostApi.releaseFlutterSurfaceTexture(); - verify(mockSurfaceProducer).release(); + verify(mockSurfaceTextureEntry).release(); } @Test diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 1dfbadab46fc..19e8c67e49b0 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android_camerax description: Android implementation of the camera plugin using the CameraX library. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android_camerax issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.6.5+4 +version: 0.6.5+3 environment: sdk: ^3.4.0 From e774891e423b47a799aa20ac043faaca6bb040f5 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 30 May 2024 11:39:09 -0700 Subject: [PATCH 2/3] Update CHANGELOG.md --- packages/camera/camera_android_camerax/CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index b35e29c9659e..b82edaf5db9e 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,3 +1,11 @@ +## 0.6.5+5 + +* Reverts changes to support Impeller. + +## 0.6.5+4 + +* [Supports Impeller](https://docs.flutter.dev/release/breaking-changes/android-surface-plugins). + ## 0.6.5+3 * Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. From a7bede5f1c12bf244f4e4ef95b9fb5fbfda66fc7 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 30 May 2024 11:39:26 -0700 Subject: [PATCH 3/3] Update pubspec.yaml --- packages/camera/camera_android_camerax/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 19e8c67e49b0..e1de51a0ee92 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android_camerax description: Android implementation of the camera plugin using the CameraX library. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android_camerax issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.6.5+3 +version: 0.6.5+5 environment: sdk: ^3.4.0