From 7bea4505126f2c71ae3daeb21545b874325ff3da Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Thu, 4 Apr 2024 14:29:10 -0700 Subject: [PATCH 1/6] Migrate CameraX from SurfaceTexture to SurfaceProducer. --- .../flutter/plugins/camerax/CameraXProxy.java | 7 ++--- .../plugins/camerax/PreviewHostApiImpl.java | 19 ++++++------ .../flutter/plugins/camerax/PreviewTest.java | 31 ++++++++----------- 3 files changed, 24 insertions(+), 33 deletions(-) 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 af7fdc36a72..65e4e78917e 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 @@ -16,6 +16,8 @@ import androidx.camera.video.Recorder; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugins.camerax.GeneratedCameraXLibrary.ResolutionInfo; +import io.flutter.view.TextureRegistry; + import java.io.File; /** Utility class used to create CameraX-related objects primarily for testing purposes. */ @@ -51,11 +53,6 @@ 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 7b1ba1214cd..0429d8e4824 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 @@ -25,7 +25,7 @@ public class PreviewHostApiImpl implements PreviewHostApi { private final TextureRegistry textureRegistry; @VisibleForTesting public @NonNull CameraXProxy cameraXProxy = new CameraXProxy(); - @VisibleForTesting public @Nullable TextureRegistry.SurfaceTextureEntry flutterSurfaceTexture; + @VisibleForTesting public @Nullable TextureRegistry.SurfaceProducer flutterSurfaceProducer; public PreviewHostApiImpl( @NonNull BinaryMessenger binaryMessenger, @@ -62,12 +62,11 @@ public void create( @Override public @NonNull Long setSurfaceProvider(@NonNull Long identifier) { Preview preview = getPreviewInstance(identifier); - flutterSurfaceTexture = textureRegistry.createSurfaceTexture(); - SurfaceTexture surfaceTexture = flutterSurfaceTexture.surfaceTexture(); - Preview.SurfaceProvider surfaceProvider = createSurfaceProvider(surfaceTexture); + flutterSurfaceProducer = textureRegistry.createSurfaceProducer(); + Preview.SurfaceProvider surfaceProvider = createSurfaceProvider(flutterSurfaceProducer); preview.setSurfaceProvider(surfaceProvider); - return flutterSurfaceTexture.id(); + return flutterSurfaceProducer.id(); } /** @@ -76,13 +75,13 @@ public void create( */ @VisibleForTesting public @NonNull Preview.SurfaceProvider createSurfaceProvider( - @NonNull SurfaceTexture surfaceTexture) { + @NonNull TextureRegistry.SurfaceProducer surfaceProducer) { return new Preview.SurfaceProvider() { @Override public void onSurfaceRequested(@NonNull SurfaceRequest request) { - surfaceTexture.setDefaultBufferSize( + surfaceProducer.setSize( request.getResolution().getWidth(), request.getResolution().getHeight()); - Surface flutterSurface = cameraXProxy.createSurface(surfaceTexture); + Surface flutterSurface = surfaceProducer.getSurface(); request.provideSurface( flutterSurface, Executors.newSingleThreadExecutor(), @@ -133,8 +132,8 @@ String getProvideSurfaceErrorDescription(int resultCode) { */ @Override public void releaseFlutterSurfaceTexture() { - if (flutterSurfaceTexture != null) { - flutterSurfaceTexture.release(); + if (flutterSurfaceProducer != null) { + flutterSurfaceProducer.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 81b455d7a86..5e282b62f3c 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 @@ -86,34 +86,30 @@ public void create_createsPreviewWithCorrectConfiguration() { public void setSurfaceProviderTest_createsSurfaceProviderAndReturnsTextureEntryId() { final PreviewHostApiImpl previewHostApi = spy(new PreviewHostApiImpl(mockBinaryMessenger, testInstanceManager, mockTextureRegistry)); - final TextureRegistry.SurfaceTextureEntry mockSurfaceTextureEntry = - mock(TextureRegistry.SurfaceTextureEntry.class); - final SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); + final TextureRegistry.SurfaceProducer mockSurfaceProducer = mock(TextureRegistry.SurfaceProducer.class); final Long previewIdentifier = 5L; - final Long surfaceTextureEntryId = 120L; + final Long surfaceProducerEntryId = 120L; previewHostApi.cameraXProxy = mockCameraXProxy; testInstanceManager.addDartCreatedInstance(mockPreview, previewIdentifier); - when(mockTextureRegistry.createSurfaceTexture()).thenReturn(mockSurfaceTextureEntry); - when(mockSurfaceTextureEntry.surfaceTexture()).thenReturn(mockSurfaceTexture); - when(mockSurfaceTextureEntry.id()).thenReturn(surfaceTextureEntryId); + when(mockTextureRegistry.createSurfaceProducer()).thenReturn(mockSurfaceProducer); + when(mockSurfaceProducer.id()).thenReturn(surfaceProducerEntryId); 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), surfaceTextureEntryId); + assertEquals(previewHostApi.setSurfaceProvider(previewIdentifier), surfaceProducerEntryId); verify(mockPreview).setSurfaceProvider(surfaceProviderCaptor.capture()); - verify(previewHostApi).createSurfaceProvider(mockSurfaceTexture); + verify(previewHostApi).createSurfaceProvider(mockSurfaceProducer); } @Test public void createSurfaceProvider_createsExpectedPreviewSurfaceProvider() { final PreviewHostApiImpl previewHostApi = new PreviewHostApiImpl(mockBinaryMessenger, testInstanceManager, mockTextureRegistry); - final SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); + final TextureRegistry.SurfaceProducer mockSurfaceProducer = mock(TextureRegistry.SurfaceProducer.class); final Surface mockSurface = mock(Surface.class); final SurfaceRequest mockSurfaceRequest = mock(SurfaceRequest.class); final SurfaceRequest.Result mockSurfaceRequestResult = mock(SurfaceRequest.Result.class); @@ -123,7 +119,6 @@ public void createSurfaceProvider_createsExpectedPreviewSurfaceProvider() { final int resolutionHeight = 500; previewHostApi.cameraXProxy = mockCameraXProxy; - when(mockCameraXProxy.createSurface(mockSurfaceTexture)).thenReturn(mockSurface); when(mockSurfaceRequest.getResolution()) .thenReturn(new Size(resolutionWidth, resolutionHeight)); when(mockCameraXProxy.createSystemServicesFlutterApiImpl(mockBinaryMessenger)) @@ -135,10 +130,10 @@ public void createSurfaceProvider_createsExpectedPreviewSurfaceProvider() { ArgumentCaptor.forClass(Consumer.class); Preview.SurfaceProvider previewSurfaceProvider = - previewHostApi.createSurfaceProvider(mockSurfaceTexture); + previewHostApi.createSurfaceProvider(mockSurfaceProducer); previewSurfaceProvider.onSurfaceRequested(mockSurfaceRequest); - verify(mockSurfaceTexture).setDefaultBufferSize(resolutionWidth, resolutionHeight); + verify(mockSurfaceProducer).setSize(resolutionWidth, resolutionHeight); verify(mockSurfaceRequest) .provideSurface(surfaceCaptor.capture(), any(Executor.class), consumerCaptor.capture()); @@ -189,13 +184,13 @@ public void createSurfaceProvider_createsExpectedPreviewSurfaceProvider() { public void releaseFlutterSurfaceTexture_makesCallToReleaseFlutterSurfaceTexture() { final PreviewHostApiImpl previewHostApi = new PreviewHostApiImpl(mockBinaryMessenger, testInstanceManager, mockTextureRegistry); - final TextureRegistry.SurfaceTextureEntry mockSurfaceTextureEntry = - mock(TextureRegistry.SurfaceTextureEntry.class); + final TextureRegistry.SurfaceProducer mockSurfaceProducer = + mock(TextureRegistry.SurfaceProducer.class); - previewHostApi.flutterSurfaceTexture = mockSurfaceTextureEntry; + previewHostApi.flutterSurfaceProducer = mockSurfaceProducer; previewHostApi.releaseFlutterSurfaceTexture(); - verify(mockSurfaceTextureEntry).release(); + verify(mockSurfaceProducer).release(); } @Test From e4ffb70307603dde0a295d5400d1ffa96f5dd0d0 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Thu, 16 May 2024 14:52:24 -0700 Subject: [PATCH 2/6] ++ --- packages/camera/camera_android_camerax/CHANGELOG.md | 3 ++- packages/camera/camera_android_camerax/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 97abd64117e..e7eebe4811e 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,6 +1,7 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. +* Updates minimum supported SDK version to Flutter 3.22/Dart 3.2. +* [Supports Impeller](https://docs.flutter.dev/release/breaking-changes/android-surface-plugins) ## 0.6.5+1 diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 813f086e032..06290bb8d2a 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -6,7 +6,7 @@ version: 0.6.5+1 environment: sdk: ^3.2.0 - flutter: ">=3.16.0" + flutter: ">=3.22.0" flutter: plugin: From da2d0f3a40cb52ea0d8b56fea75581f9d6eab4e7 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Fri, 24 May 2024 09:47:53 -0700 Subject: [PATCH 3/6] formatting. --- packages/camera/camera_android_camerax/CHANGELOG.md | 2 +- .../main/java/io/flutter/plugins/camerax/CameraXProxy.java | 4 ---- .../io/flutter/plugins/camerax/PreviewHostApiImpl.java | 1 - .../test/java/io/flutter/plugins/camerax/PreviewTest.java | 7 ++++--- packages/camera/camera_android_camerax/pubspec.yaml | 4 ++-- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 57e68adf1a7..08c3aea4b95 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,4 +1,4 @@ -## NEXT +## 0.6.5+3 * Updates minimum supported SDK version to Flutter 3.22/Dart 3.2. * [Supports Impeller](https://docs.flutter.dev/release/breaking-changes/android-surface-plugins) 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 65e4e78917e..e749940200a 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,9 +5,7 @@ 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; @@ -16,8 +14,6 @@ import androidx.camera.video.Recorder; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugins.camerax.GeneratedCameraXLibrary.ResolutionInfo; -import io.flutter.view.TextureRegistry; - import java.io.File; /** Utility class used to create CameraX-related objects primarily for testing purposes. */ 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 0429d8e4824..e2dd18b81dc 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,7 +4,6 @@ package io.flutter.plugins.camerax; -import android.graphics.SurfaceTexture; import android.util.Size; import android.view.Surface; import androidx.annotation.NonNull; 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 5e282b62f3c..a940030ec7a 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,7 +13,6 @@ 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; @@ -86,7 +85,8 @@ 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.SurfaceProducer mockSurfaceProducer = + mock(TextureRegistry.SurfaceProducer.class); final Long previewIdentifier = 5L; final Long surfaceProducerEntryId = 120L; @@ -109,7 +109,8 @@ public void setSurfaceProviderTest_createsSurfaceProviderAndReturnsTextureEntryI public void createSurfaceProvider_createsExpectedPreviewSurfaceProvider() { final PreviewHostApiImpl previewHostApi = new PreviewHostApiImpl(mockBinaryMessenger, testInstanceManager, mockTextureRegistry); - final TextureRegistry.SurfaceProducer mockSurfaceProducer = mock(TextureRegistry.SurfaceProducer.class); + final TextureRegistry.SurfaceProducer mockSurfaceProducer = + mock(TextureRegistry.SurfaceProducer.class); final Surface mockSurface = mock(Surface.class); final SurfaceRequest mockSurfaceRequest = mock(SurfaceRequest.class); final SurfaceRequest.Result mockSurfaceRequestResult = mock(SurfaceRequest.Result.class); diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 169bd3f5579..19e8c67e49b 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -2,10 +2,10 @@ 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+2 +version: 0.6.5+3 environment: - sdk: ^3.2.0 + sdk: ^3.4.0 flutter: ">=3.22.0" flutter: From 8cf4943ac9efcbb9676cad696419e8a4c0d4de21 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Fri, 24 May 2024 10:21:48 -0700 Subject: [PATCH 4/6] adjust test --- packages/camera/camera_android_camerax/CHANGELOG.md | 2 +- .../src/test/java/io/flutter/plugins/camerax/PreviewTest.java | 3 +++ packages/camera/camera_android_camerax/pubspec.yaml | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 08c3aea4b95..a03880f813b 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.6.5+3 +## 0.6.6 * Updates minimum supported SDK version to Flutter 3.22/Dart 3.2. * [Supports Impeller](https://docs.flutter.dev/release/breaking-changes/android-surface-plugins) 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 a940030ec7a..cdea569f3ed 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 @@ -124,6 +124,9 @@ public void createSurfaceProvider_createsExpectedPreviewSurfaceProvider() { .thenReturn(new Size(resolutionWidth, resolutionHeight)); when(mockCameraXProxy.createSystemServicesFlutterApiImpl(mockBinaryMessenger)) .thenReturn(mockSystemServicesFlutterApi); + when(mockTextureRegistry.createSurfaceProducer()).thenReturn(mockSurfaceProducer); + when(mockSurfaceProducer.id()).thenReturn(1); + when(mockSurfaceProducer.getSurface()).thenReturn(mockSurface); final ArgumentCaptor surfaceCaptor = ArgumentCaptor.forClass(Surface.class); @SuppressWarnings("unchecked") diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 19e8c67e49b..e4c534e53f9 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.6 environment: sdk: ^3.4.0 From 14833b18ca5baee93376fae98ecebcea75da33af Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Fri, 24 May 2024 10:54:21 -0700 Subject: [PATCH 5/6] ++ --- .../src/test/java/io/flutter/plugins/camerax/PreviewTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 cdea569f3ed..c2ff5196ad8 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 @@ -118,6 +118,7 @@ public void createSurfaceProvider_createsExpectedPreviewSurfaceProvider() { mock(SystemServicesFlutterApiImpl.class); final int resolutionWidth = 200; final int resolutionHeight = 500; + final Long surfaceProducerEntryId = 120L; previewHostApi.cameraXProxy = mockCameraXProxy; when(mockSurfaceRequest.getResolution()) @@ -125,7 +126,7 @@ public void createSurfaceProvider_createsExpectedPreviewSurfaceProvider() { when(mockCameraXProxy.createSystemServicesFlutterApiImpl(mockBinaryMessenger)) .thenReturn(mockSystemServicesFlutterApi); when(mockTextureRegistry.createSurfaceProducer()).thenReturn(mockSurfaceProducer); - when(mockSurfaceProducer.id()).thenReturn(1); + when(mockSurfaceProducer.id()).thenReturn(surfaceProducerEntryId); when(mockSurfaceProducer.getSurface()).thenReturn(mockSurface); final ArgumentCaptor surfaceCaptor = ArgumentCaptor.forClass(Surface.class); From 5f4f0e599aa0aef4750ba320cd7cda61864eddc0 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 29 May 2024 11:28:04 -0700 Subject: [PATCH 6/6] Update packages/camera/camera_android_camerax/CHANGELOG.md Co-authored-by: Camille Simon <43054281+camsim99@users.noreply.github.com> --- packages/camera/camera_android_camerax/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index a03880f813b..26d4b4cb99a 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,7 +1,7 @@ ## 0.6.6 * Updates minimum supported SDK version to Flutter 3.22/Dart 3.2. -* [Supports Impeller](https://docs.flutter.dev/release/breaking-changes/android-surface-plugins) +* [Supports Impeller](https://docs.flutter.dev/release/breaking-changes/android-surface-plugins). ## 0.6.5+2