From 0613074b6e91086ab28ceed37b51eda90d3063e7 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 7 Jan 2025 10:24:27 -0800 Subject: [PATCH 1/3] Start platform views test -- does not work --- .../example/android/app/build.gradle | 7 +++ .../plugins/cameraxexample/MainActivity.java | 59 ++++++++++++++++++- .../plugins/cameraxexample/NativeView.java | 36 +++++++++++ .../cameraxexample/NativeViewFactory.java | 31 ++++++++++ .../example/lib/camera_preview.dart | 14 ++++- 5 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeView.java create mode 100644 packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeViewFactory.java diff --git a/packages/camera/camera_android_camerax/example/android/app/build.gradle b/packages/camera/camera_android_camerax/example/android/app/build.gradle index aa54980dd3ba..b68640c5263d 100644 --- a/packages/camera/camera_android_camerax/example/android/app/build.gradle +++ b/packages/camera/camera_android_camerax/example/android/app/build.gradle @@ -55,8 +55,15 @@ flutter { } dependencies { + def camerax_version = "1.4.1" testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' api 'androidx.test:core:1.4.0' + implementation "androidx.camera:camera-core:${camerax_version}" + implementation "androidx.camera:camera-camera2:${camerax_version}" + implementation "androidx.camera:camera-lifecycle:${camerax_version}" + implementation "androidx.camera:camera-video:${camerax_version}" + implementation "androidx.camera:camera-view:${camerax_version}" + } diff --git a/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/MainActivity.java b/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/MainActivity.java index 5e2a10f1555a..a1e881863512 100644 --- a/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/MainActivity.java +++ b/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/MainActivity.java @@ -4,6 +4,63 @@ package io.flutter.plugins.cameraxexample; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; +import androidx.camera.lifecycle.ProcessCameraProvider; +import com.google.common.util.concurrent.ListenableFuture; +import android.os.Bundle; +import androidx.lifecycle.LifecycleOwner; +import androidx.camera.core.CameraSelector; +import androidx.core.content.ContextCompat; +import java.util.concurrent.ExecutionException; +import androidx.camera.core.Preview; +import androidx.camera.view.PreviewView; +import android.util.Log; -public class MainActivity extends FlutterActivity {} +public class MainActivity extends FlutterActivity { + private ListenableFuture cameraProviderFuture; + NativeViewFactory nativeViewFactory; + + @Override + public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { + nativeViewFactory = new NativeViewFactory(); + flutterEngine + .getPlatformViewsController() + .getRegistry() + .registerViewFactory("", nativeViewFactory); + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Log.e("CAMILLE", "oncreate!"); + cameraProviderFuture = ProcessCameraProvider.getInstance(this); + cameraProviderFuture.addListener(() -> { + try { + ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); + bindPreview(cameraProvider); + } catch (ExecutionException | InterruptedException e) { + // No errors need to be handled for this Future. + // This should never be reached. + } + }, ContextCompat.getMainExecutor(this)); + + } + + void bindPreview(@NonNull ProcessCameraProvider cameraProvider) { + Preview preview = new Preview.Builder() + .build(); + + CameraSelector cameraSelector = new CameraSelector.Builder() + .requireLensFacing(CameraSelector.LENS_FACING_BACK) + .build(); + + PreviewView previewView = (PreviewView) nativeViewFactory.getView2(); + preview.setSurfaceProvider(previewView.getSurfaceProvider()); + + cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview); +} +} diff --git a/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeView.java b/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeView.java new file mode 100644 index 000000000000..818b48204dee --- /dev/null +++ b/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeView.java @@ -0,0 +1,36 @@ +package io.flutter.plugins.cameraxexample; + +import android.content.Context; +import android.graphics.Color; +import android.view.View; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import io.flutter.plugin.platform.PlatformView; +import java.util.Map; +import androidx.camera.view.PreviewView; +import androidx.annotation.Nullable; + + +class NativeView implements PlatformView { + @NonNull private final TextView textView; + @NonNull private final PreviewView previewView; + + NativeView(@NonNull Context context, int id, @Nullable Map creationParams) { + textView = new TextView(context); + textView.setTextSize(72); + textView.setBackgroundColor(Color.rgb(255, 255, 255)); + textView.setText("Rendered on a native Android view (id: " + id + ")"); + + previewView = new PreviewView(context); + } + + @NonNull + @Override + public View getView() { + return previewView; + } + + @Override + public void dispose() {} +} \ No newline at end of file diff --git a/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeViewFactory.java b/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeViewFactory.java new file mode 100644 index 000000000000..6a8f6728f3d6 --- /dev/null +++ b/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeViewFactory.java @@ -0,0 +1,31 @@ +package io.flutter.plugins.cameraxexample; + +import android.content.Context; +import androidx.annotation.Nullable; +import androidx.annotation.NonNull; +import io.flutter.plugin.common.StandardMessageCodec; +import io.flutter.plugin.platform.PlatformView; +import io.flutter.plugin.platform.PlatformViewFactory; +import java.util.Map; +import android.view.View; + +class NativeViewFactory extends PlatformViewFactory { + + NativeViewFactory() { + super(StandardMessageCodec.INSTANCE); + } + + NativeView view2; + + @NonNull + @Override + public PlatformView create(@NonNull Context context, int id, @Nullable Object args) { + final Map creationParams = (Map) args; + view2 = new NativeView(context, id, creationParams); + return view2; + } + + public View getView2() { + return view2.getView(); + } +} \ No newline at end of file diff --git a/packages/camera/camera_android_camerax/example/lib/camera_preview.dart b/packages/camera/camera_android_camerax/example/lib/camera_preview.dart index 3baaaf8b1fa1..789b281df9e8 100644 --- a/packages/camera/camera_android_camerax/example/lib/camera_preview.dart +++ b/packages/camera/camera_android_camerax/example/lib/camera_preview.dart @@ -48,9 +48,21 @@ class CameraPreview extends StatelessWidget { return child; } + // This is used in the platform side to register the view. + const String viewType = ''; + // Pass parameters to the platform side. + final Map creationParams = {}; + + final Widget w = AndroidView( + viewType: viewType, + layoutDirection: TextDirection.ltr, + creationParams: creationParams, + creationParamsCodec: const StandardMessageCodec(), + ); + return RotatedBox( quarterTurns: _getQuarterTurns(), - child: child, + child: w, ); } From 0869edfbe753fbddd81821f010227db91bb04ee2 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Wed, 15 Jan 2025 09:27:53 -0800 Subject: [PATCH 2/3] debugging --- .../android/build.gradle | 1 + .../camerax/CameraAndroidCameraxPlugin.java | 37 ++++++++- .../flutter/plugins/camerax}/NativeView.java | 2 +- .../plugins/camerax}/NativeViewFactory.java | 2 +- .../plugins/camerax/PreviewHostApiImpl.java | 19 +++-- .../plugins/cameraxexample/MainActivity.java | 56 ++++++------- .../example/lib/camera_preview.dart | 15 +--- .../lib/src/android_camera_camerax.dart | 78 ++++--------------- 8 files changed, 95 insertions(+), 115 deletions(-) rename packages/camera/camera_android_camerax/{example/android/app/src/main/java/io/flutter/plugins/cameraxexample => android/src/main/java/io/flutter/plugins/camerax}/NativeView.java (95%) rename packages/camera/camera_android_camerax/{example/android/app/src/main/java/io/flutter/plugins/cameraxexample => android/src/main/java/io/flutter/plugins/camerax}/NativeViewFactory.java (94%) diff --git a/packages/camera/camera_android_camerax/android/build.gradle b/packages/camera/camera_android_camerax/android/build.gradle index a3f20e236a3d..2a9c3905efd4 100644 --- a/packages/camera/camera_android_camerax/android/build.gradle +++ b/packages/camera/camera_android_camerax/android/build.gradle @@ -68,4 +68,5 @@ dependencies { testImplementation 'org.mockito:mockito-inline:5.0.0' testImplementation 'androidx.test:core:1.4.0' testImplementation 'org.robolectric:robolectric:4.10.3' + implementation "androidx.camera:camera-view:${camerax_version}" } diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java index 42e5df0f32c1..126fcdbe43aa 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java @@ -15,6 +15,7 @@ import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.view.TextureRegistry; +import androidx.camera.view.PreviewView; /** Platform implementation of the camera_plugin implemented with the CameraX library. */ public final class CameraAndroidCameraxPlugin implements FlutterPlugin, ActivityAware { @@ -40,6 +41,8 @@ public final class CameraAndroidCameraxPlugin implements FlutterPlugin, Activity @VisibleForTesting public @Nullable LiveDataHostApiImpl liveDataHostApiImpl; + public NativeViewFactory nativeViewFactory; + /** * Initialize this within the {@code #configureFlutterEngine} of a Flutter activity or fragment. * @@ -83,7 +86,7 @@ public void setUp( GeneratedCameraXLibrary.DeviceOrientationManagerHostApi.setup( binaryMessenger, deviceOrientationManagerHostApiImpl); GeneratedCameraXLibrary.PreviewHostApi.setup( - binaryMessenger, new PreviewHostApiImpl(binaryMessenger, instanceManager, textureRegistry)); + binaryMessenger, new PreviewHostApiImpl(binaryMessenger, instanceManager, textureRegistry, nativeViewFactory)); imageCaptureHostApiImpl = new ImageCaptureHostApiImpl(binaryMessenger, instanceManager, context); GeneratedCameraXLibrary.ImageCaptureHostApi.setup(binaryMessenger, imageCaptureHostApiImpl); @@ -143,6 +146,10 @@ public void setUp( @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { pluginBinding = flutterPluginBinding; + nativeViewFactory = new NativeViewFactory(); + flutterPluginBinding + .getPlatformViewRegistry() + .registerViewFactory("", nativeViewFactory); } @Override @@ -168,7 +175,33 @@ public void onAttachedToActivity(@NonNull ActivityPluginBinding activityPluginBi // Set permissions registry reference. systemServicesHostApiImpl.setPermissionsRegistry( activityPluginBinding::addRequestPermissionsResultListener); - } + + // Log.e("CAMILLE", "onAttachedToactivity!"); + // cameraProviderFuture = ProcessCameraProvider.getInstance(this); + // cameraProviderFuture.addListener(() -> { + // try { + // ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); + // bindPreview(cameraProvider); + // } catch (ExecutionException | InterruptedException e) { + // // No errors need to be handled for this Future. + // // This should never be reached. + // } + // }, ContextCompat.getMainExecutor(this)); + // } + + // void bindPreview(@NonNull ProcessCameraProvider cameraProvider) { + // Preview preview = new Preview.Builder() + // .build(); + + // CameraSelector cameraSelector = new CameraSelector.Builder() + // .requireLensFacing(CameraSelector.LENS_FACING_BACK) + // .build(); + + // PreviewView previewView = (PreviewView) nativeViewFactory.getView2().getView(); + // preview.setSurfaceProvider(previewView.getSurfaceProvider()); + + // cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview); +} @Override public void onDetachedFromActivityForConfigChanges() { diff --git a/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeView.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/NativeView.java similarity index 95% rename from packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeView.java rename to packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/NativeView.java index 818b48204dee..ca76ea8934b3 100644 --- a/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeView.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/NativeView.java @@ -1,4 +1,4 @@ -package io.flutter.plugins.cameraxexample; +package io.flutter.plugins.camerax; import android.content.Context; import android.graphics.Color; diff --git a/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeViewFactory.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/NativeViewFactory.java similarity index 94% rename from packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeViewFactory.java rename to packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/NativeViewFactory.java index 6a8f6728f3d6..a9b7c3f4008b 100644 --- a/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/NativeViewFactory.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/NativeViewFactory.java @@ -1,4 +1,4 @@ -package io.flutter.plugins.cameraxexample; +package io.flutter.plugins.camerax; import android.content.Context; import androidx.annotation.Nullable; 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 e9b7b0d89ac6..78b6e1ae3756 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 @@ -17,6 +17,7 @@ import io.flutter.view.TextureRegistry; import java.util.Objects; import java.util.concurrent.Executors; +import androidx.camera.view.PreviewView; public class PreviewHostApiImpl implements PreviewHostApi { final BinaryMessenger binaryMessenger; @@ -25,14 +26,17 @@ public class PreviewHostApiImpl implements PreviewHostApi { @VisibleForTesting public @NonNull CameraXProxy cameraXProxy = new CameraXProxy(); @VisibleForTesting public @Nullable TextureRegistry.SurfaceProducer flutterSurfaceProducer; + public NativeViewFactory nativeViewFactory; public PreviewHostApiImpl( @NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager, - @NonNull TextureRegistry textureRegistry) { + @NonNull TextureRegistry textureRegistry, + NativeViewFactory nativeViewFactory) { this.binaryMessenger = binaryMessenger; this.instanceManager = instanceManager; this.textureRegistry = textureRegistry; + this.nativeViewFactory = nativeViewFactory; } /** Creates a {@link Preview} with the target rotation and resolution if specified. */ @@ -61,11 +65,14 @@ public void create( @Override public @NonNull Long setSurfaceProvider(@NonNull Long identifier) { Preview preview = getPreviewInstance(identifier); - flutterSurfaceProducer = textureRegistry.createSurfaceProducer(); - Preview.SurfaceProvider surfaceProvider = createSurfaceProvider(flutterSurfaceProducer); - preview.setSurfaceProvider(surfaceProvider); - - return flutterSurfaceProducer.id(); + // flutterSurfaceProducer = textureRegistry.createSurfaceProducer(); + // Preview.SurfaceProvider surfaceProvider = createSurfaceProvider(flutterSurfaceProducer); + // preview.setSurfaceProvider(surfaceProvider); + PreviewView previewView = (PreviewView) nativeViewFactory.getView2(); + preview.setSurfaceProvider(previewView.getSurfaceProvider()); + + return 3L; + // return flutterSurfaceProducer.id(); } /** diff --git a/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/MainActivity.java b/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/MainActivity.java index a1e881863512..2db772e1fd6a 100644 --- a/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/MainActivity.java +++ b/packages/camera/camera_android_camerax/example/android/app/src/main/java/io/flutter/plugins/cameraxexample/MainActivity.java @@ -20,47 +20,47 @@ import android.util.Log; public class MainActivity extends FlutterActivity { - private ListenableFuture cameraProviderFuture; - NativeViewFactory nativeViewFactory; + // private ListenableFuture cameraProviderFuture; + // NativeViewFactory nativeViewFactory; @Override public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { - nativeViewFactory = new NativeViewFactory(); - flutterEngine - .getPlatformViewsController() - .getRegistry() - .registerViewFactory("", nativeViewFactory); + // nativeViewFactory = new NativeViewFactory(); + // flutterEngine + // .getPlatformViewsController() + // .getRegistry() + // .registerViewFactory("", nativeViewFactory); } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Log.e("CAMILLE", "oncreate!"); - cameraProviderFuture = ProcessCameraProvider.getInstance(this); - cameraProviderFuture.addListener(() -> { - try { - ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); - bindPreview(cameraProvider); - } catch (ExecutionException | InterruptedException e) { - // No errors need to be handled for this Future. - // This should never be reached. - } - }, ContextCompat.getMainExecutor(this)); + // Log.e("CAMILLE", "oncreate!"); + // cameraProviderFuture = ProcessCameraProvider.getInstance(this); + // cameraProviderFuture.addListener(() -> { + // try { + // ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); + // bindPreview(cameraProvider); + // } catch (ExecutionException | InterruptedException e) { + // // No errors need to be handled for this Future. + // // This should never be reached. + // } + // }, ContextCompat.getMainExecutor(this)); } - void bindPreview(@NonNull ProcessCameraProvider cameraProvider) { - Preview preview = new Preview.Builder() - .build(); +// void bindPreview(@NonNull ProcessCameraProvider cameraProvider) { +// Preview preview = new Preview.Builder() +// .build(); - CameraSelector cameraSelector = new CameraSelector.Builder() - .requireLensFacing(CameraSelector.LENS_FACING_BACK) - .build(); +// CameraSelector cameraSelector = new CameraSelector.Builder() +// .requireLensFacing(CameraSelector.LENS_FACING_BACK) +// .build(); - PreviewView previewView = (PreviewView) nativeViewFactory.getView2(); - preview.setSurfaceProvider(previewView.getSurfaceProvider()); +// PreviewView previewView = (PreviewView) nativeViewFactory.getView2(); +// preview.setSurfaceProvider(previewView.getSurfaceProvider()); - cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview); -} +// cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview); +// } } diff --git a/packages/camera/camera_android_camerax/example/lib/camera_preview.dart b/packages/camera/camera_android_camerax/example/lib/camera_preview.dart index 789b281df9e8..82fba13d9cff 100644 --- a/packages/camera/camera_android_camerax/example/lib/camera_preview.dart +++ b/packages/camera/camera_android_camerax/example/lib/camera_preview.dart @@ -47,22 +47,9 @@ class CameraPreview extends StatelessWidget { if (kIsWeb || defaultTargetPlatform != TargetPlatform.android) { return child; } - - // This is used in the platform side to register the view. - const String viewType = ''; - // Pass parameters to the platform side. - final Map creationParams = {}; - - final Widget w = AndroidView( - viewType: viewType, - layoutDirection: TextDirection.ltr, - creationParams: creationParams, - creationParamsCodec: const StandardMessageCodec(), - ); - return RotatedBox( quarterTurns: _getQuarterTurns(), - child: w, + child: child, ); } diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart index 1d068eb24f1f..b71dc41bffaf 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart @@ -7,11 +7,14 @@ import 'dart:math' show Point; import 'package:async/async.dart'; import 'package:camera_platform_interface/camera_platform_interface.dart'; -import 'package:flutter/services.dart' - show DeviceOrientation, PlatformException; +import 'package:flutter/services.dart'; + // show DeviceOrientation, PlatformException; import 'package:flutter/widgets.dart' show RotatedBox, Size, Texture, Widget, visibleForTesting; import 'package:stream_transform/stream_transform.dart'; +import 'package:flutter/foundation.dart'; +// import 'package:flutter/services.dart'; +import 'package:flutter/material.dart' show AndroidView; import 'analyzer.dart'; import 'aspect_ratio_strategy.dart'; @@ -865,70 +868,19 @@ class AndroidCameraCameraX extends CameraPlatform { ); } - final Widget cameraPreview = Texture(textureId: cameraId); - final Map degreesForDeviceOrientation = - { - DeviceOrientation.portraitUp: 0, - DeviceOrientation.landscapeRight: 90, - DeviceOrientation.portraitDown: 180, - DeviceOrientation.landscapeLeft: 270, - }; - int naturalDeviceOrientationDegrees = - degreesForDeviceOrientation[naturalOrientation]!; - - if (isPreviewPreTransformed) { - // If the camera preview is backed by a SurfaceTexture, the transformation - // needed to correctly rotate the preview has already been applied. - // However, we may need to correct the camera preview rotation if the - // device is naturally landscape-oriented. - if (naturalOrientation == DeviceOrientation.landscapeLeft || - naturalOrientation == DeviceOrientation.landscapeRight) { - final int quarterTurnsToCorrectForLandscape = - (-naturalDeviceOrientationDegrees + 360) ~/ 4; - return RotatedBox( - quarterTurns: quarterTurnsToCorrectForLandscape, - child: cameraPreview); - } - return cameraPreview; - } - - // Fix for the rotation of the camera preview not backed by a SurfaceTexture - // with respect to the naturalOrientation of the device: + // This is used in the platform side to register the view. + const String viewType = ''; + // Pass parameters to the platform side. + final Map creationParams = {}; - final int signForCameraDirection = cameraIsFrontFacing ? 1 : -1; - - if (signForCameraDirection == 1 && - (currentDeviceOrientation == DeviceOrientation.landscapeLeft || - currentDeviceOrientation == DeviceOrientation.landscapeRight)) { - // For front-facing cameras, the image buffer is rotated counterclockwise, - // so we determine the rotation needed to correct the camera preview with - // respect to the naturalOrientation of the device based on the inverse of - // naturalOrientation. - naturalDeviceOrientationDegrees += 180; - } - - // See https://developer.android.com/media/camera/camera2/camera-preview#orientation_calculation - // for more context on this formula. - final double rotation = (sensorOrientation + - naturalDeviceOrientationDegrees * signForCameraDirection + - 360) % - 360; - int quarterTurnsToCorrectPreview = rotation ~/ 90; - - if (naturalOrientation == DeviceOrientation.landscapeLeft || - naturalOrientation == DeviceOrientation.landscapeRight) { - // We may need to correct the camera preview rotation if the device is - // naturally landscape-oriented. - quarterTurnsToCorrectPreview += - (-naturalDeviceOrientationDegrees + 360) ~/ 4; - return RotatedBox( - quarterTurns: quarterTurnsToCorrectPreview, child: cameraPreview); + return AndroidView( + viewType: viewType, + layoutDirection: TextDirection.ltr, + creationParams: creationParams, + creationParamsCodec: const StandardMessageCodec(), + ); } - return RotatedBox( - quarterTurns: quarterTurnsToCorrectPreview, child: cameraPreview); - } - /// Captures an image and returns the file where it was saved. /// /// [cameraId] is not used. From 1593eb2b48dccd4aff2504958ce688b5710cf764 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Wed, 15 Jan 2025 09:56:19 -0800 Subject: [PATCH 3/3] push to start --- .../camerax/CameraAndroidCameraxPlugin.java | 29 ++----------------- .../plugins/camerax/NativeViewFactory.java | 1 + 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java index 126fcdbe43aa..139d5621991d 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java @@ -17,6 +17,8 @@ import io.flutter.view.TextureRegistry; import androidx.camera.view.PreviewView; +import android.util.Log; + /** Platform implementation of the camera_plugin implemented with the CameraX library. */ public final class CameraAndroidCameraxPlugin implements FlutterPlugin, ActivityAware { private InstanceManager instanceManager; @@ -146,6 +148,7 @@ public void setUp( @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { pluginBinding = flutterPluginBinding; + Log.e("CAMILLE", "hey"); nativeViewFactory = new NativeViewFactory(); flutterPluginBinding .getPlatformViewRegistry() @@ -175,32 +178,6 @@ public void onAttachedToActivity(@NonNull ActivityPluginBinding activityPluginBi // Set permissions registry reference. systemServicesHostApiImpl.setPermissionsRegistry( activityPluginBinding::addRequestPermissionsResultListener); - - // Log.e("CAMILLE", "onAttachedToactivity!"); - // cameraProviderFuture = ProcessCameraProvider.getInstance(this); - // cameraProviderFuture.addListener(() -> { - // try { - // ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); - // bindPreview(cameraProvider); - // } catch (ExecutionException | InterruptedException e) { - // // No errors need to be handled for this Future. - // // This should never be reached. - // } - // }, ContextCompat.getMainExecutor(this)); - // } - - // void bindPreview(@NonNull ProcessCameraProvider cameraProvider) { - // Preview preview = new Preview.Builder() - // .build(); - - // CameraSelector cameraSelector = new CameraSelector.Builder() - // .requireLensFacing(CameraSelector.LENS_FACING_BACK) - // .build(); - - // PreviewView previewView = (PreviewView) nativeViewFactory.getView2().getView(); - // preview.setSurfaceProvider(previewView.getSurfaceProvider()); - - // cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview); } @Override diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/NativeViewFactory.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/NativeViewFactory.java index a9b7c3f4008b..16a489479c6f 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/NativeViewFactory.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/NativeViewFactory.java @@ -19,6 +19,7 @@ class NativeViewFactory extends PlatformViewFactory { @NonNull @Override + @SuppressWarnings("unchecked") public PlatformView create(@NonNull Context context, int id, @Nullable Object args) { final Map creationParams = (Map) args; view2 = new NativeView(context, id, creationParams);