diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md
index d5355c60c751..080240a64f42 100644
--- a/packages/camera/camera_android_camerax/CHANGELOG.md
+++ b/packages/camera/camera_android_camerax/CHANGELOG.md
@@ -8,3 +8,4 @@
* Adds Camera and UseCase classes, along with methods for binding UseCases to a lifecycle with the ProcessCameraProvider.
* Bump CameraX version to 1.3.0-alpha03 and Kotlin version to 1.8.0.
* Changes instance manager to allow the separate creation of identical objects.
+* Adds Preview and Surface classes, along with other methods needed to implement camera preview.
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 c35394f01d82..b61e7ac72224 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
@@ -49,6 +49,8 @@ void setUp(BinaryMessenger binaryMessenger, Context context, TextureRegistry tex
binaryMessenger, processCameraProviderHostApi);
systemServicesHostApi = new SystemServicesHostApiImpl(binaryMessenger, instanceManager);
GeneratedCameraXLibrary.SystemServicesHostApi.setup(binaryMessenger, systemServicesHostApi);
+ GeneratedCameraXLibrary.PreviewHostApi.setup(
+ binaryMessenger, new PreviewHostApiImpl(binaryMessenger, instanceManager, textureRegistry));
}
@Override
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 83c43a9d55d4..4a3d277a4dc3 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,8 +5,14 @@
package io.flutter.plugins.camerax;
import android.app.Activity;
+import android.graphics.SurfaceTexture;
+import android.view.Surface;
+import androidx.annotation.NonNull;
import androidx.camera.core.CameraSelector;
+import androidx.camera.core.Preview;
+import io.flutter.plugin.common.BinaryMessenger;
+/** Utility class used to create CameraX-related objects primarily for testing purposes. */
public class CameraXProxy {
public CameraSelector.Builder createCameraSelectorBuilder() {
return new CameraSelector.Builder();
@@ -17,10 +23,29 @@ public CameraPermissionsManager createCameraPermissionsManager() {
}
public DeviceOrientationManager createDeviceOrientationManager(
- Activity activity,
- Boolean isFrontFacing,
- int sensorOrientation,
- DeviceOrientationManager.DeviceOrientationChangeCallback callback) {
+ @NonNull Activity activity,
+ @NonNull Boolean isFrontFacing,
+ @NonNull int sensorOrientation,
+ @NonNull DeviceOrientationManager.DeviceOrientationChangeCallback callback) {
return new DeviceOrientationManager(activity, isFrontFacing, sensorOrientation, callback);
}
+
+ public Preview.Builder createPreviewBuilder() {
+ return new Preview.Builder();
+ }
+
+ public Surface createSurface(@NonNull SurfaceTexture surfaceTexture) {
+ return new Surface(surfaceTexture);
+ }
+
+ /**
+ * Creates an instance of the {@code SystemServicesFlutterApiImpl}.
+ *
+ *
Included in this class to utilize the callback methods it provides, e.g. {@code
+ * onCameraError(String)}.
+ */
+ public SystemServicesFlutterApiImpl createSystemServicesFlutterApiImpl(
+ @NonNull BinaryMessenger binaryMessenger) {
+ return new SystemServicesFlutterApiImpl(binaryMessenger);
+ }
}
diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/GeneratedCameraXLibrary.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/GeneratedCameraXLibrary.java
index 528870cc749c..1e61ea699292 100644
--- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/GeneratedCameraXLibrary.java
+++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/GeneratedCameraXLibrary.java
@@ -25,6 +25,82 @@
@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"})
public class GeneratedCameraXLibrary {
+ /** Generated class from Pigeon that represents data sent in messages. */
+ public static class ResolutionInfo {
+ private @NonNull Long width;
+
+ public @NonNull Long getWidth() {
+ return width;
+ }
+
+ public void setWidth(@NonNull Long setterArg) {
+ if (setterArg == null) {
+ throw new IllegalStateException("Nonnull field \"width\" is null.");
+ }
+ this.width = setterArg;
+ }
+
+ private @NonNull Long height;
+
+ public @NonNull Long getHeight() {
+ return height;
+ }
+
+ public void setHeight(@NonNull Long setterArg) {
+ if (setterArg == null) {
+ throw new IllegalStateException("Nonnull field \"height\" is null.");
+ }
+ this.height = setterArg;
+ }
+
+ /** Constructor is private to enforce null safety; use Builder. */
+ private ResolutionInfo() {}
+
+ public static final class Builder {
+ private @Nullable Long width;
+
+ public @NonNull Builder setWidth(@NonNull Long setterArg) {
+ this.width = setterArg;
+ return this;
+ }
+
+ private @Nullable Long height;
+
+ public @NonNull Builder setHeight(@NonNull Long setterArg) {
+ this.height = setterArg;
+ return this;
+ }
+
+ public @NonNull ResolutionInfo build() {
+ ResolutionInfo pigeonReturn = new ResolutionInfo();
+ pigeonReturn.setWidth(width);
+ pigeonReturn.setHeight(height);
+ return pigeonReturn;
+ }
+ }
+
+ @NonNull
+ Map toMap() {
+ Map toMapResult = new HashMap<>();
+ toMapResult.put("width", width);
+ toMapResult.put("height", height);
+ return toMapResult;
+ }
+
+ static @NonNull ResolutionInfo fromMap(@NonNull Map map) {
+ ResolutionInfo pigeonResult = new ResolutionInfo();
+ Object width = map.get("width");
+ pigeonResult.setWidth(
+ (width == null) ? null : ((width instanceof Integer) ? (Integer) width : (Long) width));
+ Object height = map.get("height");
+ pigeonResult.setHeight(
+ (height == null)
+ ? null
+ : ((height instanceof Integer) ? (Integer) height : (Long) height));
+ return pigeonResult;
+ }
+ }
+
/** Generated class from Pigeon that represents data sent in messages. */
public static class CameraPermissionsErrorData {
private @NonNull String errorCode;
@@ -843,6 +919,185 @@ public void onDeviceOrientationChanged(@NonNull String orientationArg, Reply callback) {
+ BasicMessageChannel