From 58814150ab0eb3d48bf9c979173c3636e8952557 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 21 Sep 2022 16:28:20 -0700 Subject: [PATCH 01/17] Add main components --- .../camerax/CameraInfoFlutterApiImpl.java | 3 +- .../camerax/GeneratedCameraXLibrary.java | 366 ++++++++++-------- .../ProcessCameraProviderFlutterApiImpl.java | 23 ++ .../ProcessCameraProviderHostApiImpl.java | 82 ++++ ...roid_camera_camerax_flutter_api_impls.dart | 6 + .../lib/src/camera_info.dart | 2 +- .../lib/src/camerax_library.pigeon.dart | 177 ++++++--- .../lib/src/process_camera_provider.dart | 116 ++++++ .../pigeons/camerax_library.dart | 13 + .../test/test_camerax_library.pigeon.dart | 99 +++-- 10 files changed, 630 insertions(+), 257 deletions(-) create mode 100644 packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderFlutterApiImpl.java create mode 100644 packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java create mode 100644 packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java index b5ba9fc1ff3b..7c055e292ece 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java @@ -18,7 +18,6 @@ public CameraInfoFlutterApiImpl( } void create(CameraInfo cameraInfo, Reply reply) { - instanceManager.addHostCreatedInstance(cameraInfo); - create(instanceManager.getIdentifierForStrongReference(cameraInfo), reply); + create( instanceManager.addHostCreatedInstance(cameraInfo), reply); } } 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 e87a80db030c..e96529af790d 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 @@ -13,22 +13,28 @@ import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MessageCodec; import io.flutter.plugin.common.StandardMessageCodec; -import java.util.ArrayList; +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; import java.util.Arrays; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.HashMap; /** Generated class from Pigeon. */ @SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"}) public class GeneratedCameraXLibrary { + + public interface Result { + void success(T result); + void error(Throwable error); + } private static class JavaObjectHostApiCodec extends StandardMessageCodec { public static final JavaObjectHostApiCodec INSTANCE = new JavaObjectHostApiCodec(); - private JavaObjectHostApiCodec() {} } - /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + /** Generated interface from Pigeon that represents a handler of messages from Flutter.*/ public interface JavaObjectHostApi { void dispose(@NonNull Long identifier); @@ -37,287 +43,329 @@ static MessageCodec getCodec() { return JavaObjectHostApiCodec.INSTANCE; } - /** - * Sets up an instance of `JavaObjectHostApi` to handle messages through the `binaryMessenger`. - */ + /** Sets up an instance of `JavaObjectHostApi` to handle messages through the `binaryMessenger`. */ static void setup(BinaryMessenger binaryMessenger, JavaObjectHostApi api) { { BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.JavaObjectHostApi.dispose", getCodec()); + new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.JavaObjectHostApi.dispose", getCodec()); if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - Map wrapped = new HashMap<>(); - try { - ArrayList args = (ArrayList) message; - Number identifierArg = (Number) args.get(0); - if (identifierArg == null) { - throw new NullPointerException("identifierArg unexpectedly null."); - } - api.dispose((identifierArg == null) ? null : identifierArg.longValue()); - wrapped.put("result", null); - } catch (Error | RuntimeException exception) { - wrapped.put("error", wrapError(exception)); - } - reply.reply(wrapped); - }); + channel.setMessageHandler((message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList)message; + Number identifierArg = (Number)args.get(0); + if (identifierArg == null) { + throw new NullPointerException("identifierArg unexpectedly null."); + } + api.dispose((identifierArg == null) ? null : identifierArg.longValue()); + wrapped.put("result", null); + } + catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); } else { channel.setMessageHandler(null); } } } } - private static class JavaObjectFlutterApiCodec extends StandardMessageCodec { public static final JavaObjectFlutterApiCodec INSTANCE = new JavaObjectFlutterApiCodec(); - private JavaObjectFlutterApiCodec() {} } - /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ + /** Generated class from Pigeon that represents Flutter messages that can be called from Java.*/ public static class JavaObjectFlutterApi { private final BinaryMessenger binaryMessenger; - - public JavaObjectFlutterApi(BinaryMessenger argBinaryMessenger) { + public JavaObjectFlutterApi(BinaryMessenger argBinaryMessenger){ this.binaryMessenger = argBinaryMessenger; } - public interface Reply { void reply(T reply); } - static MessageCodec getCodec() { return JavaObjectFlutterApiCodec.INSTANCE; } public void dispose(@NonNull Long identifierArg, Reply callback) { BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.JavaObjectFlutterApi.dispose", getCodec()); - channel.send( - new ArrayList(Arrays.asList(identifierArg)), - channelReply -> { - callback.reply(null); - }); + new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.JavaObjectFlutterApi.dispose", getCodec()); + channel.send(new ArrayList(Arrays.asList(identifierArg)), channelReply -> { + callback.reply(null); + }); } } - private static class CameraInfoHostApiCodec extends StandardMessageCodec { public static final CameraInfoHostApiCodec INSTANCE = new CameraInfoHostApiCodec(); - private CameraInfoHostApiCodec() {} } - /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + /** Generated interface from Pigeon that represents a handler of messages from Flutter.*/ public interface CameraInfoHostApi { - @NonNull - Long getSensorRotationDegrees(@NonNull Long identifier); + @NonNull Long getSensorRotationDegrees(@NonNull Long identifier); /** The codec used by CameraInfoHostApi. */ static MessageCodec getCodec() { return CameraInfoHostApiCodec.INSTANCE; } - /** - * Sets up an instance of `CameraInfoHostApi` to handle messages through the `binaryMessenger`. - */ + /** Sets up an instance of `CameraInfoHostApi` to handle messages through the `binaryMessenger`. */ static void setup(BinaryMessenger binaryMessenger, CameraInfoHostApi api) { { BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees", - getCodec()); + new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees", getCodec()); if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - Map wrapped = new HashMap<>(); - try { - ArrayList args = (ArrayList) message; - Number identifierArg = (Number) args.get(0); - if (identifierArg == null) { - throw new NullPointerException("identifierArg unexpectedly null."); - } - Long output = - api.getSensorRotationDegrees( - (identifierArg == null) ? null : identifierArg.longValue()); - wrapped.put("result", output); - } catch (Error | RuntimeException exception) { - wrapped.put("error", wrapError(exception)); - } - reply.reply(wrapped); - }); + channel.setMessageHandler((message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList)message; + Number identifierArg = (Number)args.get(0); + if (identifierArg == null) { + throw new NullPointerException("identifierArg unexpectedly null."); + } + Long output = api.getSensorRotationDegrees((identifierArg == null) ? null : identifierArg.longValue()); + wrapped.put("result", output); + } + catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); } else { channel.setMessageHandler(null); } } } } - private static class CameraInfoFlutterApiCodec extends StandardMessageCodec { public static final CameraInfoFlutterApiCodec INSTANCE = new CameraInfoFlutterApiCodec(); - private CameraInfoFlutterApiCodec() {} } - /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ + /** Generated class from Pigeon that represents Flutter messages that can be called from Java.*/ public static class CameraInfoFlutterApi { private final BinaryMessenger binaryMessenger; - - public CameraInfoFlutterApi(BinaryMessenger argBinaryMessenger) { + public CameraInfoFlutterApi(BinaryMessenger argBinaryMessenger){ this.binaryMessenger = argBinaryMessenger; } - public interface Reply { void reply(T reply); } - static MessageCodec getCodec() { return CameraInfoFlutterApiCodec.INSTANCE; } public void create(@NonNull Long identifierArg, Reply callback) { BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.CameraInfoFlutterApi.create", getCodec()); - channel.send( - new ArrayList(Arrays.asList(identifierArg)), - channelReply -> { - callback.reply(null); - }); + new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.CameraInfoFlutterApi.create", getCodec()); + channel.send(new ArrayList(Arrays.asList(identifierArg)), channelReply -> { + callback.reply(null); + }); } } - private static class CameraSelectorHostApiCodec extends StandardMessageCodec { public static final CameraSelectorHostApiCodec INSTANCE = new CameraSelectorHostApiCodec(); - private CameraSelectorHostApiCodec() {} } - /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + /** Generated interface from Pigeon that represents a handler of messages from Flutter.*/ public interface CameraSelectorHostApi { void create(@NonNull Long identifier, @Nullable Long lensFacing); - - @NonNull - List filter(@NonNull Long identifier, @NonNull List cameraInfoIds); + @NonNull List filter(@NonNull Long identifier, @NonNull List cameraInfoIds); /** The codec used by CameraSelectorHostApi. */ static MessageCodec getCodec() { return CameraSelectorHostApiCodec.INSTANCE; } - /** - * Sets up an instance of `CameraSelectorHostApi` to handle messages through the - * `binaryMessenger`. - */ + /** Sets up an instance of `CameraSelectorHostApi` to handle messages through the `binaryMessenger`. */ static void setup(BinaryMessenger binaryMessenger, CameraSelectorHostApi api) { { BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.CameraSelectorHostApi.create", getCodec()); + new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.CameraSelectorHostApi.create", getCodec()); if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - Map wrapped = new HashMap<>(); - try { - ArrayList args = (ArrayList) message; - Number identifierArg = (Number) args.get(0); - if (identifierArg == null) { - throw new NullPointerException("identifierArg unexpectedly null."); - } - Number lensFacingArg = (Number) args.get(1); - api.create( - (identifierArg == null) ? null : identifierArg.longValue(), - (lensFacingArg == null) ? null : lensFacingArg.longValue()); - wrapped.put("result", null); - } catch (Error | RuntimeException exception) { - wrapped.put("error", wrapError(exception)); - } - reply.reply(wrapped); - }); + channel.setMessageHandler((message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList)message; + Number identifierArg = (Number)args.get(0); + if (identifierArg == null) { + throw new NullPointerException("identifierArg unexpectedly null."); + } + Number lensFacingArg = (Number)args.get(1); + api.create((identifierArg == null) ? null : identifierArg.longValue(), (lensFacingArg == null) ? null : lensFacingArg.longValue()); + wrapped.put("result", null); + } + catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); } else { channel.setMessageHandler(null); } } { BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.CameraSelectorHostApi.filter", getCodec()); + new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.CameraSelectorHostApi.filter", getCodec()); if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - Map wrapped = new HashMap<>(); - try { - ArrayList args = (ArrayList) message; - Number identifierArg = (Number) args.get(0); - if (identifierArg == null) { - throw new NullPointerException("identifierArg unexpectedly null."); - } - List cameraInfoIdsArg = (List) args.get(1); - if (cameraInfoIdsArg == null) { - throw new NullPointerException("cameraInfoIdsArg unexpectedly null."); - } - List output = - api.filter( - (identifierArg == null) ? null : identifierArg.longValue(), - cameraInfoIdsArg); - wrapped.put("result", output); - } catch (Error | RuntimeException exception) { - wrapped.put("error", wrapError(exception)); - } - reply.reply(wrapped); - }); + channel.setMessageHandler((message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList)message; + Number identifierArg = (Number)args.get(0); + if (identifierArg == null) { + throw new NullPointerException("identifierArg unexpectedly null."); + } + List cameraInfoIdsArg = (List)args.get(1); + if (cameraInfoIdsArg == null) { + throw new NullPointerException("cameraInfoIdsArg unexpectedly null."); + } + List output = api.filter((identifierArg == null) ? null : identifierArg.longValue(), cameraInfoIdsArg); + wrapped.put("result", output); + } + catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); } else { channel.setMessageHandler(null); } } } } - private static class CameraSelectorFlutterApiCodec extends StandardMessageCodec { - public static final CameraSelectorFlutterApiCodec INSTANCE = - new CameraSelectorFlutterApiCodec(); - + public static final CameraSelectorFlutterApiCodec INSTANCE = new CameraSelectorFlutterApiCodec(); private CameraSelectorFlutterApiCodec() {} } - /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ + /** Generated class from Pigeon that represents Flutter messages that can be called from Java.*/ public static class CameraSelectorFlutterApi { private final BinaryMessenger binaryMessenger; - - public CameraSelectorFlutterApi(BinaryMessenger argBinaryMessenger) { + public CameraSelectorFlutterApi(BinaryMessenger argBinaryMessenger){ this.binaryMessenger = argBinaryMessenger; } - public interface Reply { void reply(T reply); } - static MessageCodec getCodec() { return CameraSelectorFlutterApiCodec.INSTANCE; } - public void create( - @NonNull Long identifierArg, @Nullable Long lensFacingArg, Reply callback) { + public void create(@NonNull Long identifierArg, @Nullable Long lensFacingArg, Reply callback) { BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.CameraSelectorFlutterApi.create", getCodec()); - channel.send( - new ArrayList(Arrays.asList(identifierArg, lensFacingArg)), - channelReply -> { - callback.reply(null); + new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.CameraSelectorFlutterApi.create", getCodec()); + channel.send(new ArrayList(Arrays.asList(identifierArg, lensFacingArg)), channelReply -> { + callback.reply(null); + }); + } + } + private static class ProcessCameraProviderHostApiCodec extends StandardMessageCodec { + public static final ProcessCameraProviderHostApiCodec INSTANCE = new ProcessCameraProviderHostApiCodec(); + private ProcessCameraProviderHostApiCodec() {} + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter.*/ + public interface ProcessCameraProviderHostApi { + void getInstance(Result result); + @NonNull List getAvailableCameraInfos(@NonNull Long instanceId); + + /** The codec used by ProcessCameraProviderHostApi. */ + static MessageCodec getCodec() { + return ProcessCameraProviderHostApiCodec.INSTANCE; + } + + /** Sets up an instance of `ProcessCameraProviderHostApi` to handle messages through the `binaryMessenger`. */ + static void setup(BinaryMessenger binaryMessenger, ProcessCameraProviderHostApi api) { + { + BasicMessageChannel channel = + new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance", getCodec()); + if (api != null) { + channel.setMessageHandler((message, reply) -> { + Map wrapped = new HashMap<>(); + try { + Result resultCallback = new Result() { + public void success(Long result) { + wrapped.put("result", result); + reply.reply(wrapped); + } + public void error(Throwable error) { + wrapped.put("error", wrapError(error)); + reply.reply(wrapped); + } + }; + + api.getInstance(resultCallback); + } + catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + reply.reply(wrapped); + } }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos", getCodec()); + if (api != null) { + channel.setMessageHandler((message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList)message; + Number instanceIdArg = (Number)args.get(0); + if (instanceIdArg == null) { + throw new NullPointerException("instanceIdArg unexpectedly null."); + } + List output = api.getAvailableCameraInfos((instanceIdArg == null) ? null : instanceIdArg.longValue()); + wrapped.put("result", output); + } + catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } } } + private static class ProcessCameraProviderFlutterApiCodec extends StandardMessageCodec { + public static final ProcessCameraProviderFlutterApiCodec INSTANCE = new ProcessCameraProviderFlutterApiCodec(); + private ProcessCameraProviderFlutterApiCodec() {} + } + + /** Generated class from Pigeon that represents Flutter messages that can be called from Java.*/ + public static class ProcessCameraProviderFlutterApi { + private final BinaryMessenger binaryMessenger; + public ProcessCameraProviderFlutterApi(BinaryMessenger argBinaryMessenger){ + this.binaryMessenger = argBinaryMessenger; + } + public interface Reply { + void reply(T reply); + } + static MessageCodec getCodec() { + return ProcessCameraProviderFlutterApiCodec.INSTANCE; + } + public void create(@NonNull Long instanceIdArg, Reply callback) { + BasicMessageChannel channel = + new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create", getCodec()); + channel.send(new ArrayList(Arrays.asList(instanceIdArg)), channelReply -> { + callback.reply(null); + }); + } + } private static Map wrapError(Throwable exception) { Map errorMap = new HashMap<>(); errorMap.put("message", exception.toString()); errorMap.put("code", exception.getClass().getSimpleName()); - errorMap.put( - "details", - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + errorMap.put("details", "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); return errorMap; } } diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderFlutterApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderFlutterApiImpl.java new file mode 100644 index 000000000000..90c94d0c26cb --- /dev/null +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderFlutterApiImpl.java @@ -0,0 +1,23 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.camerax; + +import androidx.camera.lifecycle.ProcessCameraProvider; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugins.camerax.GeneratedCameraXLibrary.ProcessCameraProviderFlutterApi; + +public class ProcessCameraProviderFlutterApiImpl extends ProcessCameraProviderFlutterApi { + public ProcessCameraProviderFlutterApiImpl( + BinaryMessenger binaryMessenger, InstanceManager instanceManager) { + super(binaryMessenger); + this.instanceManager = instanceManager; + } + + private final InstanceManager instanceManager; + + void create(ProcessCameraProvider processCameraProvider, Reply reply) { + create(instanceManager.addHostCreatedInstance(processCameraProvider), reply); + } +} diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java new file mode 100644 index 000000000000..10415a484e47 --- /dev/null +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java @@ -0,0 +1,82 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.camerax; + +import android.content.Context; +import androidx.annotation.NonNull; +import androidx.camera.core.CameraInfo; +import androidx.camera.lifecycle.ProcessCameraProvider; +import androidx.core.content.ContextCompat; +import com.google.common.util.concurrent.ListenableFuture; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugins.camerax.GeneratedCameraXLibrary.ProcessCameraProviderHostApi; +import java.util.ArrayList; +import java.util.List; + +public class ProcessCameraProviderHostApiImpl implements ProcessCameraProviderHostApi { + private final BinaryMessenger binaryMessenger; + private final InstanceManager instanceManager; + + private Context context; + + public ProcessCameraProviderHostApiImpl( + BinaryMessenger binaryMessenger, InstanceManager instanceManager, Context context) { + this.binaryMessenger = binaryMessenger; + this.instanceManager = instanceManager; + this.context = context; + } + + // TODO(cs): Add documentation about this + public void setContext(Context context) { + this.context = context; + } + + /** Returns the instance of the ProcessCameraProvider. */ + @Override + public void getInstance(GeneratedCameraXLibrary.Result result) { + ListenableFuture cameraProviderFuture = + ProcessCameraProvider.getInstance(context); + + cameraProviderFuture.addListener( + () -> { + try { + // Camera provider is now guaranteed to be available. + ProcessCameraProvider processCameraProvider = cameraProviderFuture.get(); + + if (!instanceManager.containsInstance(processCameraProvider)) { + // If cameraProvider is already defined, this method will have no effect. + final ProcessCameraProviderFlutterApiImpl flutterApi = + new ProcessCameraProviderFlutterApiImpl(binaryMessenger, instanceManager); + + flutterApi.create(processCameraProvider, reply -> {}); + + result.success(processCameraProviderId); + } + } catch (Exception e) { + result.error(e); + } + }, + ContextCompat.getMainExecutor(context)); + } + + /** Returns cameras available to the ProcessCameraProvider. */ + @Override + public List getAvailableCameraInfos(@NonNull Long instanceId) { + ProcessCameraProvider processCameraProvider = + (ProcessCameraProvider) instanceManager.getInstance(instanceId); // may return null? + + List availableCameras = processCameraProvider.getAvailableCameraInfos(); + List availableCamerasIds = new ArrayList(); + final CameraInfoFlutterApiImpl cameraInfoFlutterApi = + new CameraInfoFlutterApiImpl(binaryMessenger, instanceManager); + + for (CameraInfo cameraInfo : availableCameras) { + cameraInfoFlutterApi.create(cameraInfo, result -> {}); + Long cameraInfoId2 = instanceManager.getIdentifierForStrongReference(cameraInfo); + availableCamerasIds.add(cameraInfoId); + } + return availableCamerasIds; + } +} diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart index 576260c0b7b8..e5e59f0357b8 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart @@ -14,6 +14,7 @@ class AndroidCameraXCameraFlutterApis { JavaObjectFlutterApiImpl? javaObjectFlutterApi, CameraInfoFlutterApiImpl? cameraInfoFlutterApi, CameraSelectorFlutterApiImpl? cameraSelectorFlutterApi, + ProcessCameraProviderFlutterApiImpl? processCameraProviderFlutterApi, }) { this.javaObjectFlutterApi = javaObjectFlutterApi ?? JavaObjectFlutterApiImpl(); @@ -21,6 +22,7 @@ class AndroidCameraXCameraFlutterApis { cameraInfoFlutterApi ?? CameraInfoFlutterApiImpl(); this.cameraSelectorFlutterApi = cameraSelectorFlutterApi ?? CameraSelectorFlutterApiImpl(); + this.processCameraProviderFlutterApi ?? ProcessCameraProviderFlutterApiImpl(); } static bool _haveBeenSetUp = false; @@ -40,12 +42,16 @@ class AndroidCameraXCameraFlutterApis { /// Flutter Api for [CameraSelector]. late final CameraSelectorFlutterApiImpl cameraSelectorFlutterApi; + /// Flutter Api for [ProcessCameraProvider]. + late final ProcessCameraProviderFlutterApiImpl processCameraProviderFlutterApi; + /// Ensures all the Flutter APIs have been setup to receive calls from native code. void ensureSetUp() { if (!_haveBeenSetUp) { JavaObjectFlutterApi.setup(javaObjectFlutterApi); CameraInfoFlutterApi.setup(cameraInfoFlutterApi); CameraSelectorFlutterApi.setup(cameraSelectorFlutterApi); + ProcessCameraProviderFlutterApi.setup(processCameraProviderFlutterApi); _haveBeenSetUp = true; } } diff --git a/packages/camera/camera_android_camerax/lib/src/camera_info.dart b/packages/camera/camera_android_camerax/lib/src/camera_info.dart index d03426f40027..6d714809abf9 100644 --- a/packages/camera/camera_android_camerax/lib/src/camera_info.dart +++ b/packages/camera/camera_android_camerax/lib/src/camera_info.dart @@ -15,7 +15,7 @@ import 'java_object.dart'; class CameraInfo extends JavaObject { /// Constructs a [CameraInfo] that is not automatically attached to a native object. CameraInfo.detached( - {BinaryMessenger? binaryMessenger, InstanceManager? instanceManager}) + {this.binaryMessenger, InstanceManager? instanceManager}) : super.detached( binaryMessenger: binaryMessenger, instanceManager: instanceManager) { diff --git a/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart b/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart index a399001d35b0..a0f7b3dca518 100644 --- a/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart +++ b/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart @@ -18,8 +18,7 @@ class JavaObjectHostApi { /// Constructor for [JavaObjectHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - JavaObjectHostApi({BinaryMessenger? binaryMessenger}) - : _binaryMessenger = binaryMessenger; + JavaObjectHostApi({BinaryMessenger? binaryMessenger}) : _binaryMessenger = binaryMessenger; final BinaryMessenger? _binaryMessenger; @@ -27,8 +26,7 @@ class JavaObjectHostApi { Future dispose(int arg_identifier) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.JavaObjectHostApi.dispose', codec, - binaryMessenger: _binaryMessenger); + 'dev.flutter.pigeon.JavaObjectHostApi.dispose', codec, binaryMessenger: _binaryMessenger); final Map? replyMap = await channel.send([arg_identifier]) as Map?; if (replyMap == null) { @@ -37,8 +35,7 @@ class JavaObjectHostApi { message: 'Unable to establish connection on channel.', ); } else if (replyMap['error'] != null) { - final Map error = - (replyMap['error'] as Map?)!; + final Map error = (replyMap['error'] as Map?)!; throw PlatformException( code: (error['code'] as String?)!, message: error['message'] as String?, @@ -53,27 +50,22 @@ class JavaObjectHostApi { class _JavaObjectFlutterApiCodec extends StandardMessageCodec { const _JavaObjectFlutterApiCodec(); } - abstract class JavaObjectFlutterApi { static const MessageCodec codec = _JavaObjectFlutterApiCodec(); void dispose(int identifier); - static void setup(JavaObjectFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(JavaObjectFlutterApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.JavaObjectFlutterApi.dispose', codec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.JavaObjectFlutterApi.dispose', codec, binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.JavaObjectFlutterApi.dispose was null.'); + assert(message != null, 'Argument for dev.flutter.pigeon.JavaObjectFlutterApi.dispose was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, - 'Argument for dev.flutter.pigeon.JavaObjectFlutterApi.dispose was null, expected non-null int.'); + assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.JavaObjectFlutterApi.dispose was null, expected non-null int.'); api.dispose(arg_identifier!); return; }); @@ -90,8 +82,7 @@ class CameraInfoHostApi { /// Constructor for [CameraInfoHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - CameraInfoHostApi({BinaryMessenger? binaryMessenger}) - : _binaryMessenger = binaryMessenger; + CameraInfoHostApi({BinaryMessenger? binaryMessenger}) : _binaryMessenger = binaryMessenger; final BinaryMessenger? _binaryMessenger; @@ -99,8 +90,7 @@ class CameraInfoHostApi { Future getSensorRotationDegrees(int arg_identifier) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees', codec, - binaryMessenger: _binaryMessenger); + 'dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees', codec, binaryMessenger: _binaryMessenger); final Map? replyMap = await channel.send([arg_identifier]) as Map?; if (replyMap == null) { @@ -109,8 +99,7 @@ class CameraInfoHostApi { message: 'Unable to establish connection on channel.', ); } else if (replyMap['error'] != null) { - final Map error = - (replyMap['error'] as Map?)!; + final Map error = (replyMap['error'] as Map?)!; throw PlatformException( code: (error['code'] as String?)!, message: error['message'] as String?, @@ -130,27 +119,22 @@ class CameraInfoHostApi { class _CameraInfoFlutterApiCodec extends StandardMessageCodec { const _CameraInfoFlutterApiCodec(); } - abstract class CameraInfoFlutterApi { static const MessageCodec codec = _CameraInfoFlutterApiCodec(); void create(int identifier); - static void setup(CameraInfoFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(CameraInfoFlutterApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraInfoFlutterApi.create', codec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.CameraInfoFlutterApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.CameraInfoFlutterApi.create was null.'); + assert(message != null, 'Argument for dev.flutter.pigeon.CameraInfoFlutterApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, - 'Argument for dev.flutter.pigeon.CameraInfoFlutterApi.create was null, expected non-null int.'); + assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.CameraInfoFlutterApi.create was null, expected non-null int.'); api.create(arg_identifier!); return; }); @@ -167,8 +151,7 @@ class CameraSelectorHostApi { /// Constructor for [CameraSelectorHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - CameraSelectorHostApi({BinaryMessenger? binaryMessenger}) - : _binaryMessenger = binaryMessenger; + CameraSelectorHostApi({BinaryMessenger? binaryMessenger}) : _binaryMessenger = binaryMessenger; final BinaryMessenger? _binaryMessenger; @@ -176,19 +159,16 @@ class CameraSelectorHostApi { Future create(int arg_identifier, int? arg_lensFacing) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraSelectorHostApi.create', codec, - binaryMessenger: _binaryMessenger); + 'dev.flutter.pigeon.CameraSelectorHostApi.create', codec, binaryMessenger: _binaryMessenger); final Map? replyMap = - await channel.send([arg_identifier, arg_lensFacing]) - as Map?; + await channel.send([arg_identifier, arg_lensFacing]) as Map?; if (replyMap == null) { throw PlatformException( code: 'channel-error', message: 'Unable to establish connection on channel.', ); } else if (replyMap['error'] != null) { - final Map error = - (replyMap['error'] as Map?)!; + final Map error = (replyMap['error'] as Map?)!; throw PlatformException( code: (error['code'] as String?)!, message: error['message'] as String?, @@ -199,22 +179,18 @@ class CameraSelectorHostApi { } } - Future> filter( - int arg_identifier, List arg_cameraInfoIds) async { + Future> filter(int arg_identifier, List arg_cameraInfoIds) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraSelectorHostApi.filter', codec, - binaryMessenger: _binaryMessenger); + 'dev.flutter.pigeon.CameraSelectorHostApi.filter', codec, binaryMessenger: _binaryMessenger); final Map? replyMap = - await channel.send([arg_identifier, arg_cameraInfoIds]) - as Map?; + await channel.send([arg_identifier, arg_cameraInfoIds]) as Map?; if (replyMap == null) { throw PlatformException( code: 'channel-error', message: 'Unable to establish connection on channel.', ); } else if (replyMap['error'] != null) { - final Map error = - (replyMap['error'] as Map?)!; + final Map error = (replyMap['error'] as Map?)!; throw PlatformException( code: (error['code'] as String?)!, message: error['message'] as String?, @@ -234,27 +210,22 @@ class CameraSelectorHostApi { class _CameraSelectorFlutterApiCodec extends StandardMessageCodec { const _CameraSelectorFlutterApiCodec(); } - abstract class CameraSelectorFlutterApi { static const MessageCodec codec = _CameraSelectorFlutterApiCodec(); void create(int identifier, int? lensFacing); - static void setup(CameraSelectorFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(CameraSelectorFlutterApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraSelectorFlutterApi.create', codec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.CameraSelectorFlutterApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.CameraSelectorFlutterApi.create was null.'); + assert(message != null, 'Argument for dev.flutter.pigeon.CameraSelectorFlutterApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, - 'Argument for dev.flutter.pigeon.CameraSelectorFlutterApi.create was null, expected non-null int.'); + assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.CameraSelectorFlutterApi.create was null, expected non-null int.'); final int? arg_lensFacing = (args[1] as int?); api.create(arg_identifier!, arg_lensFacing); return; @@ -263,3 +234,99 @@ abstract class CameraSelectorFlutterApi { } } } + +class _ProcessCameraProviderHostApiCodec extends StandardMessageCodec { + const _ProcessCameraProviderHostApiCodec(); +} + +class ProcessCameraProviderHostApi { + /// Constructor for [ProcessCameraProviderHostApi]. The [binaryMessenger] named argument is + /// available for dependency injection. If it is left null, the default + /// BinaryMessenger will be used which routes to the host platform. + ProcessCameraProviderHostApi({BinaryMessenger? binaryMessenger}) : _binaryMessenger = binaryMessenger; + + final BinaryMessenger? _binaryMessenger; + + static const MessageCodec codec = _ProcessCameraProviderHostApiCodec(); + + Future getInstance() async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance', codec, binaryMessenger: _binaryMessenger); + final Map? replyMap = + await channel.send(null) as Map?; + if (replyMap == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyMap['error'] != null) { + final Map error = (replyMap['error'] as Map?)!; + throw PlatformException( + code: (error['code'] as String?)!, + message: error['message'] as String?, + details: error['details'], + ); + } else if (replyMap['result'] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (replyMap['result'] as int?)!; + } + } + + Future> getAvailableCameraInfos(int arg_instanceId) async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', codec, binaryMessenger: _binaryMessenger); + final Map? replyMap = + await channel.send([arg_instanceId]) as Map?; + if (replyMap == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyMap['error'] != null) { + final Map error = (replyMap['error'] as Map?)!; + throw PlatformException( + code: (error['code'] as String?)!, + message: error['message'] as String?, + details: error['details'], + ); + } else if (replyMap['result'] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (replyMap['result'] as List?)!.cast(); + } + } +} + +class _ProcessCameraProviderFlutterApiCodec extends StandardMessageCodec { + const _ProcessCameraProviderFlutterApiCodec(); +} +abstract class ProcessCameraProviderFlutterApi { + static const MessageCodec codec = _ProcessCameraProviderFlutterApiCodec(); + + void create(int instanceId); + static void setup(ProcessCameraProviderFlutterApi? api, {BinaryMessenger? binaryMessenger}) { + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create', codec, binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMessageHandler(null); + } else { + channel.setMessageHandler((Object? message) async { + assert(message != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create was null.'); + final List args = (message as List?)!; + final int? arg_instanceId = (args[0] as int?); + assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create was null, expected non-null int.'); + api.create(arg_instanceId!); + return; + }); + } + } + } +} diff --git a/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart b/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart new file mode 100644 index 000000000000..e954a8712bfd --- /dev/null +++ b/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart @@ -0,0 +1,116 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/services.dart'; + +import 'android_camera_camerax_flutter_api_impls.dart'; +import 'camera_info.dart'; +import 'camerax_library.pigeon.dart'; +import 'instance_manager.dart'; +import 'java_object.dart'; + +/// Provides an object to manage the camera. +/// +/// See https://developer.android.com/reference/androidx/camera/lifecycle/ProcessCameraProvider. +class ProcessCameraProvider extends JavaObject { + /// Creates a detached [ProcessCameraProvider]. + ProcessCameraProvider.detached( + {this.binaryMessenger, InstanceManager? instanceManager}) + : super.detached( + binaryMessenger: binaryMessenger, + instanceManager: instanceManager) { + this.instanceManger = instanceManager ?? JavaObject.globalInstanceManager; + _api = ProcessCameraProviderHostApiImpl(binaryMessenger: binaryMessenger); + AndroidCameraXCameraFlutterApis.instance.ensureSetUp(); + } + + /// Receives binary data across the Flutter platform barrier. + /// + /// If it is null, the default BinaryMessenger will be used which routes to + /// the host platform. + final BinaryMessenger? binaryMessenger; + + /// Maintains instances stored to communicate with native language objects. + late final InstanceManager instanceManager; + + late final ProcessCameraProviderHostApiImpl _api; + + /// Gets an instance of [ProcessCameraProvider]. + static Future getInstance( + {BinaryMessenger? binaryMessenger, InstanceManager? instanceManager}) { + AndroidCameraXCameraFlutterApis.instance.ensureSetUp(); + final ProcessCameraProviderHostApiImpl api = + ProcessCameraProviderHostApiImpl(binaryMessenger: binaryMessenger); + + return api.getInstancefromInstances(instanceManager); + } + + /// Retrieves the cameras available to the device. + Future> getAvailableCameraInfos() { + return _api.getAvailableCameraInfosFromInstances(this, instanceManager); + } +} + +/// Host API implementation of [ProcessCameraProvider]. +class ProcessCameraProviderHostApiImpl extends ProcessCameraProviderHostApi { + /// Creates a [ProcessCameraProviderHostApiImpl]. + ProcessCameraProviderHostApiImpl({super.binaryMessenger}); + + /// Retrieves an instance of a ProcessCameraProvider from the context of + /// the FlutterActivity. + Future getInstancefromInstances( + InstanceManager instanceManager) async { + return instanceManager.getInstanceWithWeakReference(await getInstance())! + as ProcessCameraProvider; + } + + /// Retrives the list of CameraInfos corresponding to the available cameras. + Future> getAvailableCameraInfosFromInstances( + CameraInfo instance, + InstanceManager instanceManager, + BinaryMessenger? binaryMessenger) async { + int? identifier = instanceManager.getIdentifier(instance); + identifier ??= instanceManager.addDartCreatedInstance(instance, + onCopy: (ProcessCameraProvider original) { + return ProcessCameraProvider.detached( + binaryMessenger: binaryMessenger, + instanceManager: instanceManager); + }); + + final List cameraInfos = await getAvailableCameraInfos(identifier); + return (cameraInfos.map((int? id) => + instanceManager.getInstanceWithWeakReference(id!)! as CameraInfo)) + .toList(); + } +} + +/// Flutter API Implementation of [ProcessCameraProvider]. +class ProcessCameraProviderFlutterApiImpl + implements ProcessCameraProviderFlutterApi { + /// Constructs a [ProcessCameraProviderFlutterApiImpl]. + ProcessCameraProviderFlutterApiImpl({ + this.binaryMessenger, + InstanceManager? instanceManager, + }) : instanceManager = instanceManager ?? JavaObject.globalInstanceManager; + + /// Receives binary data across the Flutter platform barrier. + /// + /// If it is null, the default BinaryMessenger will be used which routes to + /// the host platform. + final BinaryMessenger? binaryMessenger; + + /// Maintains instances stored to communicate with native language objects. + final InstanceManager instanceManager; + + @override + void create(int identifier) { + instanceManager.addHostCreatedInstance( + ProcessCameraProvider.detached(), + identifier, + onCopy: (ProcessCameraProvider original) { + return ProcessCameraProvider.detached(); + }, + ); + } +} diff --git a/packages/camera/camera_android_camerax/pigeons/camerax_library.dart b/packages/camera/camera_android_camerax/pigeons/camerax_library.dart index aace7a06b1fd..61d18d4dedae 100644 --- a/packages/camera/camera_android_camerax/pigeons/camerax_library.dart +++ b/packages/camera/camera_android_camerax/pigeons/camerax_library.dart @@ -57,3 +57,16 @@ abstract class CameraSelectorHostApi { abstract class CameraSelectorFlutterApi { void create(int identifier, int? lensFacing); } + +@HostApi(dartHostTestHandler: 'TestProcessCameraProviderHostApi') +abstract class ProcessCameraProviderHostApi { + @async + int getInstance(); + + List getAvailableCameraInfos(int instanceId); +} + +@FlutterApi() +abstract class ProcessCameraProviderFlutterApi { + void create(int instanceId); +} diff --git a/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart b/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart index b10e14e9d518..b40f7db8ae81 100644 --- a/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart +++ b/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart @@ -16,27 +16,22 @@ import 'package:camera_android_camerax/src/camerax_library.pigeon.dart'; class _TestJavaObjectHostApiCodec extends StandardMessageCodec { const _TestJavaObjectHostApiCodec(); } - abstract class TestJavaObjectHostApi { static const MessageCodec codec = _TestJavaObjectHostApiCodec(); void dispose(int identifier); - static void setup(TestJavaObjectHostApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestJavaObjectHostApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.JavaObjectHostApi.dispose', codec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.JavaObjectHostApi.dispose', codec, binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { channel.setMockMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.JavaObjectHostApi.dispose was null.'); + assert(message != null, 'Argument for dev.flutter.pigeon.JavaObjectHostApi.dispose was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, - 'Argument for dev.flutter.pigeon.JavaObjectHostApi.dispose was null, expected non-null int.'); + assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.JavaObjectHostApi.dispose was null, expected non-null int.'); api.dispose(arg_identifier!); return {}; }); @@ -48,28 +43,22 @@ abstract class TestJavaObjectHostApi { class _TestCameraInfoHostApiCodec extends StandardMessageCodec { const _TestCameraInfoHostApiCodec(); } - abstract class TestCameraInfoHostApi { static const MessageCodec codec = _TestCameraInfoHostApiCodec(); int getSensorRotationDegrees(int identifier); - static void setup(TestCameraInfoHostApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestCameraInfoHostApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees', - codec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees', codec, binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { channel.setMockMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees was null.'); + assert(message != null, 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, - 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees was null, expected non-null int.'); + assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees was null, expected non-null int.'); final int output = api.getSensorRotationDegrees(arg_identifier!); return {'result': output}; }); @@ -81,28 +70,23 @@ abstract class TestCameraInfoHostApi { class _TestCameraSelectorHostApiCodec extends StandardMessageCodec { const _TestCameraSelectorHostApiCodec(); } - abstract class TestCameraSelectorHostApi { static const MessageCodec codec = _TestCameraSelectorHostApiCodec(); void create(int identifier, int? lensFacing); List filter(int identifier, List cameraInfoIds); - static void setup(TestCameraSelectorHostApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestCameraSelectorHostApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraSelectorHostApi.create', codec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.CameraSelectorHostApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { channel.setMockMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.create was null.'); + assert(message != null, 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, - 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.create was null, expected non-null int.'); + assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.create was null, expected non-null int.'); final int? arg_lensFacing = (args[1] as int?); api.create(arg_identifier!, arg_lensFacing); return {}; @@ -111,24 +95,59 @@ abstract class TestCameraSelectorHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraSelectorHostApi.filter', codec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.CameraSelectorHostApi.filter', codec, binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { channel.setMockMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null.'); + assert(message != null, 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, - 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null, expected non-null int.'); - final List? arg_cameraInfoIds = - (args[1] as List?)?.cast(); - assert(arg_cameraInfoIds != null, - 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null, expected non-null List.'); - final List output = - api.filter(arg_identifier!, arg_cameraInfoIds!); + assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null, expected non-null int.'); + final List? arg_cameraInfoIds = (args[1] as List?)?.cast(); + assert(arg_cameraInfoIds != null, 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null, expected non-null List.'); + final List output = api.filter(arg_identifier!, arg_cameraInfoIds!); + return {'result': output}; + }); + } + } + } +} + +class _TestProcessCameraProviderHostApiCodec extends StandardMessageCodec { + const _TestProcessCameraProviderHostApiCodec(); +} +abstract class TestProcessCameraProviderHostApi { + static const MessageCodec codec = _TestProcessCameraProviderHostApiCodec(); + + Future getInstance(); + List getAvailableCameraInfos(int instanceId); + static void setup(TestProcessCameraProviderHostApi? api, {BinaryMessenger? binaryMessenger}) { + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance', codec, binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMockMessageHandler(null); + } else { + channel.setMockMessageHandler((Object? message) async { + // ignore message + final int output = await api.getInstance(); + return {'result': output}; + }); + } + } + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', codec, binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMockMessageHandler(null); + } else { + channel.setMockMessageHandler((Object? message) async { + assert(message != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos was null.'); + final List args = (message as List?)!; + final int? arg_instanceId = (args[0] as int?); + assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos was null, expected non-null int.'); + final List output = api.getAvailableCameraInfos(arg_instanceId!); return {'result': output}; }); } From 83c76028d3256ffe25fd6f09e4a5cda97fb92b81 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Thu, 22 Sep 2022 15:24:44 -0700 Subject: [PATCH 02/17] Add tests --- .../android/build.gradle | 2 + .../camerax/CameraInfoFlutterApiImpl.java | 2 +- .../ProcessCameraProviderHostApiImpl.java | 10 ++-- ...roid_camera_camerax_flutter_api_impls.dart | 4 +- .../lib/src/camera_info.dart | 2 +- .../lib/src/process_camera_provider.dart | 47 ++++++++++--------- 6 files changed, 34 insertions(+), 33 deletions(-) diff --git a/packages/camera/camera_android_camerax/android/build.gradle b/packages/camera/camera_android_camerax/android/build.gradle index 1772afebe429..c02b0de215ac 100644 --- a/packages/camera/camera_android_camerax/android/build.gradle +++ b/packages/camera/camera_android_camerax/android/build.gradle @@ -42,9 +42,11 @@ dependencies { implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" implementation "androidx.camera:camera-lifecycle:${camerax_version}" + implementation 'com.google.guava:guava:28.1-android' testImplementation 'junit:junit:4.13.2' testImplementation 'org.mockito:mockito-inline:4.7.0' testImplementation 'androidx.test:core:1.4.0' + testImplementation 'org.robolectric:robolectric:4.3' } testOptions { unitTests.includeAndroidResources = true diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java index 7c055e292ece..c538e420cc7e 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java @@ -18,6 +18,6 @@ public CameraInfoFlutterApiImpl( } void create(CameraInfo cameraInfo, Reply reply) { - create( instanceManager.addHostCreatedInstance(cameraInfo), reply); + create(instanceManager.addHostCreatedInstance(cameraInfo), reply); } } diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java index 10415a484e47..a3298ec6ae35 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java @@ -46,14 +46,11 @@ public void getInstance(GeneratedCameraXLibrary.Result result) { ProcessCameraProvider processCameraProvider = cameraProviderFuture.get(); if (!instanceManager.containsInstance(processCameraProvider)) { - // If cameraProvider is already defined, this method will have no effect. final ProcessCameraProviderFlutterApiImpl flutterApi = new ProcessCameraProviderFlutterApiImpl(binaryMessenger, instanceManager); - flutterApi.create(processCameraProvider, reply -> {}); - - result.success(processCameraProviderId); } + result.success(instanceManager.getIdentifierForStrongReference(processCameraProvider)); } catch (Exception e) { result.error(e); } @@ -65,7 +62,7 @@ public void getInstance(GeneratedCameraXLibrary.Result result) { @Override public List getAvailableCameraInfos(@NonNull Long instanceId) { ProcessCameraProvider processCameraProvider = - (ProcessCameraProvider) instanceManager.getInstance(instanceId); // may return null? + (ProcessCameraProvider) instanceManager.getInstance(instanceId); List availableCameras = processCameraProvider.getAvailableCameraInfos(); List availableCamerasIds = new ArrayList(); @@ -74,8 +71,7 @@ public List getAvailableCameraInfos(@NonNull Long instanceId) { for (CameraInfo cameraInfo : availableCameras) { cameraInfoFlutterApi.create(cameraInfo, result -> {}); - Long cameraInfoId2 = instanceManager.getIdentifierForStrongReference(cameraInfo); - availableCamerasIds.add(cameraInfoId); + availableCamerasIds.add(instanceManager.getIdentifierForStrongReference(cameraInfo)); } return availableCamerasIds; } diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart index e5e59f0357b8..4e63ba994583 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart @@ -6,6 +6,7 @@ import 'camera_info.dart'; import 'camera_selector.dart'; import 'camerax_library.pigeon.dart'; import 'java_object.dart'; +import 'process_camera_provider.dart'; /// Handles initialization of Flutter APIs for the Android CameraX library. class AndroidCameraXCameraFlutterApis { @@ -43,7 +44,8 @@ class AndroidCameraXCameraFlutterApis { late final CameraSelectorFlutterApiImpl cameraSelectorFlutterApi; /// Flutter Api for [ProcessCameraProvider]. - late final ProcessCameraProviderFlutterApiImpl processCameraProviderFlutterApi; + late final ProcessCameraProviderFlutterApiImpl + processCameraProviderFlutterApi; /// Ensures all the Flutter APIs have been setup to receive calls from native code. void ensureSetUp() { diff --git a/packages/camera/camera_android_camerax/lib/src/camera_info.dart b/packages/camera/camera_android_camerax/lib/src/camera_info.dart index 6d714809abf9..d03426f40027 100644 --- a/packages/camera/camera_android_camerax/lib/src/camera_info.dart +++ b/packages/camera/camera_android_camerax/lib/src/camera_info.dart @@ -15,7 +15,7 @@ import 'java_object.dart'; class CameraInfo extends JavaObject { /// Constructs a [CameraInfo] that is not automatically attached to a native object. CameraInfo.detached( - {this.binaryMessenger, InstanceManager? instanceManager}) + {BinaryMessenger? binaryMessenger, InstanceManager? instanceManager}) : super.detached( binaryMessenger: binaryMessenger, instanceManager: instanceManager) { diff --git a/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart b/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart index e954a8712bfd..270a846841d8 100644 --- a/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart +++ b/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart @@ -16,24 +16,15 @@ import 'java_object.dart'; class ProcessCameraProvider extends JavaObject { /// Creates a detached [ProcessCameraProvider]. ProcessCameraProvider.detached( - {this.binaryMessenger, InstanceManager? instanceManager}) + {BinaryMessenger? binaryMessenger, InstanceManager? instanceManager}) : super.detached( binaryMessenger: binaryMessenger, instanceManager: instanceManager) { - this.instanceManger = instanceManager ?? JavaObject.globalInstanceManager; - _api = ProcessCameraProviderHostApiImpl(binaryMessenger: binaryMessenger); + _api = ProcessCameraProviderHostApiImpl( + binaryMessenger: binaryMessenger, instanceManager: instanceManager); AndroidCameraXCameraFlutterApis.instance.ensureSetUp(); } - /// Receives binary data across the Flutter platform barrier. - /// - /// If it is null, the default BinaryMessenger will be used which routes to - /// the host platform. - final BinaryMessenger? binaryMessenger; - - /// Maintains instances stored to communicate with native language objects. - late final InstanceManager instanceManager; - late final ProcessCameraProviderHostApiImpl _api; /// Gets an instance of [ProcessCameraProvider]. @@ -41,41 +32,51 @@ class ProcessCameraProvider extends JavaObject { {BinaryMessenger? binaryMessenger, InstanceManager? instanceManager}) { AndroidCameraXCameraFlutterApis.instance.ensureSetUp(); final ProcessCameraProviderHostApiImpl api = - ProcessCameraProviderHostApiImpl(binaryMessenger: binaryMessenger); + ProcessCameraProviderHostApiImpl( + binaryMessenger: binaryMessenger, instanceManager: instanceManager); - return api.getInstancefromInstances(instanceManager); + return api.getInstancefromInstances(); } /// Retrieves the cameras available to the device. Future> getAvailableCameraInfos() { - return _api.getAvailableCameraInfosFromInstances(this, instanceManager); + return _api.getAvailableCameraInfosFromInstances(this); } } /// Host API implementation of [ProcessCameraProvider]. class ProcessCameraProviderHostApiImpl extends ProcessCameraProviderHostApi { /// Creates a [ProcessCameraProviderHostApiImpl]. - ProcessCameraProviderHostApiImpl({super.binaryMessenger}); + ProcessCameraProviderHostApiImpl( + {this.binaryMessenger, InstanceManager? instanceManager}) + : super(binaryMessenger: binaryMessenger) { + this.instanceManager = instanceManager ?? JavaObject.globalInstanceManager; + } + + /// Receives binary data across the Flutter platform barrier. + /// + /// If it is null, the default BinaryMessenger will be used which routes to + /// the host platform. + final BinaryMessenger? binaryMessenger; + + /// Maintains instances stored to communicate with native language objects. + late final InstanceManager instanceManager; /// Retrieves an instance of a ProcessCameraProvider from the context of /// the FlutterActivity. - Future getInstancefromInstances( - InstanceManager instanceManager) async { + Future getInstancefromInstances() async { return instanceManager.getInstanceWithWeakReference(await getInstance())! as ProcessCameraProvider; } /// Retrives the list of CameraInfos corresponding to the available cameras. Future> getAvailableCameraInfosFromInstances( - CameraInfo instance, - InstanceManager instanceManager, - BinaryMessenger? binaryMessenger) async { + ProcessCameraProvider instance) async { int? identifier = instanceManager.getIdentifier(instance); identifier ??= instanceManager.addDartCreatedInstance(instance, onCopy: (ProcessCameraProvider original) { return ProcessCameraProvider.detached( - binaryMessenger: binaryMessenger, - instanceManager: instanceManager); + binaryMessenger: binaryMessenger, instanceManager: instanceManager); }); final List cameraInfos = await getAvailableCameraInfos(identifier); From be9130f4e21421ae45dc0d21d70809dc06b43932 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 26 Sep 2022 08:11:41 -0700 Subject: [PATCH 03/17] Add dart tests --- .../test/process_camera_provider_test.dart | 97 +++++++++++++++++++ .../process_camera_provider_test.mocks.dart | 40 ++++++++ 2 files changed, 137 insertions(+) create mode 100644 packages/camera/camera_android_camerax/test/process_camera_provider_test.dart create mode 100644 packages/camera/camera_android_camerax/test/process_camera_provider_test.mocks.dart diff --git a/packages/camera/camera_android_camerax/test/process_camera_provider_test.dart b/packages/camera/camera_android_camerax/test/process_camera_provider_test.dart new file mode 100644 index 000000000000..8f635ff68802 --- /dev/null +++ b/packages/camera/camera_android_camerax/test/process_camera_provider_test.dart @@ -0,0 +1,97 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:camera_android_camerax/src/camera_info.dart'; +import 'package:camera_android_camerax/src/process_camera_provider.dart'; +import 'package:camera_android_camerax/src/camerax_library.pigeon.dart'; +import 'package:camera_android_camerax/src/instance_manager.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'process_camera_provider_test.mocks.dart'; +import 'test_camerax_library.pigeon.dart'; + +@GenerateMocks([TestProcessCameraProviderHostApi]) +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('ProcessCameraProvider', () { + tearDown(() => TestProcessCameraProviderHostApi.setup(null)); + + test('getInstanceTest', () async { + final MockTestProcessCameraProviderHostApi mockApi = + MockTestProcessCameraProviderHostApi(); + TestProcessCameraProviderHostApi.setup(mockApi); + + final InstanceManager instanceManager = InstanceManager( + onWeakReferenceRemoved: (_) {}, + ); + final ProcessCameraProvider processCameraProvider = + ProcessCameraProvider.detached( + instanceManager: instanceManager, + ); + + instanceManager.addHostCreatedInstance( + processCameraProvider, + 0, + onCopy: (_) => ProcessCameraProvider.detached(), + ); + + when(mockApi.getInstance()).thenAnswer((_) async => 0); + expect( + await ProcessCameraProvider.getInstance( + instanceManager: instanceManager), + equals(processCameraProvider)); + verify(mockApi.getInstance()); + }); + + test('getAvailableCameraInfosTest', () async { + final MockTestProcessCameraProviderHostApi mockApi = + MockTestProcessCameraProviderHostApi(); + TestProcessCameraProviderHostApi.setup(mockApi); + + final InstanceManager instanceManager = InstanceManager( + onWeakReferenceRemoved: (_) {}, + ); + final ProcessCameraProvider processCameraProvider = + ProcessCameraProvider.detached( + instanceManager: instanceManager, + ); + + instanceManager.addHostCreatedInstance( + processCameraProvider, + 0, + onCopy: (_) => ProcessCameraProvider.detached(), + ); + CameraInfo fakeAvailableCameraInfo = + CameraInfo.detached(instanceManager: instanceManager); + instanceManager.addHostCreatedInstance( + fakeAvailableCameraInfo, + 1, + onCopy: (_) => CameraInfo.detached(), + ); + + when(mockApi.getAvailableCameraInfos(0)).thenReturn([1]); + expect(await processCameraProvider.getAvailableCameraInfos(), + equals([fakeAvailableCameraInfo])); + verify(mockApi.getAvailableCameraInfos(0)); + }); + + test('flutterApiCreateTest', () { + final InstanceManager instanceManager = InstanceManager( + onWeakReferenceRemoved: (_) {}, + ); + final ProcessCameraProviderFlutterApiImpl flutterApi = + ProcessCameraProviderFlutterApiImpl( + instanceManager: instanceManager, + ); + + flutterApi.create(0); + + expect(instanceManager.getInstanceWithWeakReference(0), + isA()); + }); + }); +} diff --git a/packages/camera/camera_android_camerax/test/process_camera_provider_test.mocks.dart b/packages/camera/camera_android_camerax/test/process_camera_provider_test.mocks.dart new file mode 100644 index 000000000000..923058880572 --- /dev/null +++ b/packages/camera/camera_android_camerax/test/process_camera_provider_test.mocks.dart @@ -0,0 +1,40 @@ +// Mocks generated by Mockito 5.3.0 from annotations +// in camera_android_camerax/test/process_camera_provider_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; + +import 'test_camerax_library.pigeon.dart' as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +/// A class which mocks [TestProcessCameraProviderHostApi]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTestProcessCameraProviderHostApi extends _i1.Mock + implements _i2.TestProcessCameraProviderHostApi { + MockTestProcessCameraProviderHostApi() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future getInstance() => + (super.noSuchMethod(Invocation.method(#getInstance, []), + returnValue: _i3.Future.value(0)) as _i3.Future); + @override + List getAvailableCameraInfos(int? instanceId) => (super.noSuchMethod( + Invocation.method(#getAvailableCameraInfos, [instanceId]), + returnValue: []) as List); +} From fe3c0c361867b6f5b60a4ea2c651c255cb444d1d Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 26 Sep 2022 08:16:24 -0700 Subject: [PATCH 04/17] Remove unecessary dependencies --- packages/camera/camera_android_camerax/android/build.gradle | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/camera/camera_android_camerax/android/build.gradle b/packages/camera/camera_android_camerax/android/build.gradle index c02b0de215ac..1772afebe429 100644 --- a/packages/camera/camera_android_camerax/android/build.gradle +++ b/packages/camera/camera_android_camerax/android/build.gradle @@ -42,11 +42,9 @@ dependencies { implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" implementation "androidx.camera:camera-lifecycle:${camerax_version}" - implementation 'com.google.guava:guava:28.1-android' testImplementation 'junit:junit:4.13.2' testImplementation 'org.mockito:mockito-inline:4.7.0' testImplementation 'androidx.test:core:1.4.0' - testImplementation 'org.robolectric:robolectric:4.3' } testOptions { unitTests.includeAndroidResources = true From e0b980d2a2cc502ed6e298f97280ba8615307b8e Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 26 Sep 2022 08:17:17 -0700 Subject: [PATCH 05/17] Formatting --- .../camerax/CameraAndroidCameraxPlugin.java | 3 + .../camerax/GeneratedCameraXLibrary.java | 394 +++++++++++------- .../lib/src/camerax_library.pigeon.dart | 116 ++++-- .../test/test_camerax_library.pigeon.dart | 81 ++-- 4 files changed, 378 insertions(+), 216 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 bb5756a7e3b9..c9f05836d789 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 @@ -39,6 +39,9 @@ void setUp(BinaryMessenger binaryMessenger, Context context) { binaryMessenger, new JavaObjectHostApiImpl(instanceManager)); GeneratedCameraXLibrary.CameraSelectorHostApi.setup( binaryMessenger, new CameraSelectorHostApiImpl(binaryMessenger, instanceManager)); + GeneratedCameraXLibrary.ProcessCameraProviderHostApi.setup( + binaryMessenger, + new ProcessCameraProviderHostApiImpl(binaryMessenger, instanceManager, context)); } @Override 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 e96529af790d..d8e95cef99a3 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 @@ -13,13 +13,11 @@ import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MessageCodec; import io.flutter.plugin.common.StandardMessageCodec; -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.HashMap; /** Generated class from Pigeon. */ @SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"}) @@ -27,14 +25,17 @@ public class GeneratedCameraXLibrary { public interface Result { void success(T result); + void error(Throwable error); } + private static class JavaObjectHostApiCodec extends StandardMessageCodec { public static final JavaObjectHostApiCodec INSTANCE = new JavaObjectHostApiCodec(); + private JavaObjectHostApiCodec() {} } - /** Generated interface from Pigeon that represents a handler of messages from Flutter.*/ + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface JavaObjectHostApi { void dispose(@NonNull Long identifier); @@ -43,329 +44,414 @@ static MessageCodec getCodec() { return JavaObjectHostApiCodec.INSTANCE; } - /** Sets up an instance of `JavaObjectHostApi` to handle messages through the `binaryMessenger`. */ + /** + * Sets up an instance of `JavaObjectHostApi` to handle messages through the `binaryMessenger`. + */ static void setup(BinaryMessenger binaryMessenger, JavaObjectHostApi api) { { BasicMessageChannel channel = - new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.JavaObjectHostApi.dispose", getCodec()); + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.JavaObjectHostApi.dispose", getCodec()); if (api != null) { - channel.setMessageHandler((message, reply) -> { - Map wrapped = new HashMap<>(); - try { - ArrayList args = (ArrayList)message; - Number identifierArg = (Number)args.get(0); - if (identifierArg == null) { - throw new NullPointerException("identifierArg unexpectedly null."); - } - api.dispose((identifierArg == null) ? null : identifierArg.longValue()); - wrapped.put("result", null); - } - catch (Error | RuntimeException exception) { - wrapped.put("error", wrapError(exception)); - } - reply.reply(wrapped); - }); + channel.setMessageHandler( + (message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList) message; + Number identifierArg = (Number) args.get(0); + if (identifierArg == null) { + throw new NullPointerException("identifierArg unexpectedly null."); + } + api.dispose((identifierArg == null) ? null : identifierArg.longValue()); + wrapped.put("result", null); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); } else { channel.setMessageHandler(null); } } } } + private static class JavaObjectFlutterApiCodec extends StandardMessageCodec { public static final JavaObjectFlutterApiCodec INSTANCE = new JavaObjectFlutterApiCodec(); + private JavaObjectFlutterApiCodec() {} } - /** Generated class from Pigeon that represents Flutter messages that can be called from Java.*/ + /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ public static class JavaObjectFlutterApi { private final BinaryMessenger binaryMessenger; - public JavaObjectFlutterApi(BinaryMessenger argBinaryMessenger){ + + public JavaObjectFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } + public interface Reply { void reply(T reply); } + static MessageCodec getCodec() { return JavaObjectFlutterApiCodec.INSTANCE; } public void dispose(@NonNull Long identifierArg, Reply callback) { BasicMessageChannel channel = - new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.JavaObjectFlutterApi.dispose", getCodec()); - channel.send(new ArrayList(Arrays.asList(identifierArg)), channelReply -> { - callback.reply(null); - }); + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.JavaObjectFlutterApi.dispose", getCodec()); + channel.send( + new ArrayList(Arrays.asList(identifierArg)), + channelReply -> { + callback.reply(null); + }); } } + private static class CameraInfoHostApiCodec extends StandardMessageCodec { public static final CameraInfoHostApiCodec INSTANCE = new CameraInfoHostApiCodec(); + private CameraInfoHostApiCodec() {} } - /** Generated interface from Pigeon that represents a handler of messages from Flutter.*/ + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface CameraInfoHostApi { - @NonNull Long getSensorRotationDegrees(@NonNull Long identifier); + @NonNull + Long getSensorRotationDegrees(@NonNull Long identifier); /** The codec used by CameraInfoHostApi. */ static MessageCodec getCodec() { return CameraInfoHostApiCodec.INSTANCE; } - /** Sets up an instance of `CameraInfoHostApi` to handle messages through the `binaryMessenger`. */ + /** + * Sets up an instance of `CameraInfoHostApi` to handle messages through the `binaryMessenger`. + */ static void setup(BinaryMessenger binaryMessenger, CameraInfoHostApi api) { { BasicMessageChannel channel = - new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees", getCodec()); + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees", + getCodec()); if (api != null) { - channel.setMessageHandler((message, reply) -> { - Map wrapped = new HashMap<>(); - try { - ArrayList args = (ArrayList)message; - Number identifierArg = (Number)args.get(0); - if (identifierArg == null) { - throw new NullPointerException("identifierArg unexpectedly null."); - } - Long output = api.getSensorRotationDegrees((identifierArg == null) ? null : identifierArg.longValue()); - wrapped.put("result", output); - } - catch (Error | RuntimeException exception) { - wrapped.put("error", wrapError(exception)); - } - reply.reply(wrapped); - }); + channel.setMessageHandler( + (message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList) message; + Number identifierArg = (Number) args.get(0); + if (identifierArg == null) { + throw new NullPointerException("identifierArg unexpectedly null."); + } + Long output = + api.getSensorRotationDegrees( + (identifierArg == null) ? null : identifierArg.longValue()); + wrapped.put("result", output); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); } else { channel.setMessageHandler(null); } } } } + private static class CameraInfoFlutterApiCodec extends StandardMessageCodec { public static final CameraInfoFlutterApiCodec INSTANCE = new CameraInfoFlutterApiCodec(); + private CameraInfoFlutterApiCodec() {} } - /** Generated class from Pigeon that represents Flutter messages that can be called from Java.*/ + /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ public static class CameraInfoFlutterApi { private final BinaryMessenger binaryMessenger; - public CameraInfoFlutterApi(BinaryMessenger argBinaryMessenger){ + + public CameraInfoFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } + public interface Reply { void reply(T reply); } + static MessageCodec getCodec() { return CameraInfoFlutterApiCodec.INSTANCE; } public void create(@NonNull Long identifierArg, Reply callback) { BasicMessageChannel channel = - new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.CameraInfoFlutterApi.create", getCodec()); - channel.send(new ArrayList(Arrays.asList(identifierArg)), channelReply -> { - callback.reply(null); - }); + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.CameraInfoFlutterApi.create", getCodec()); + channel.send( + new ArrayList(Arrays.asList(identifierArg)), + channelReply -> { + callback.reply(null); + }); } } + private static class CameraSelectorHostApiCodec extends StandardMessageCodec { public static final CameraSelectorHostApiCodec INSTANCE = new CameraSelectorHostApiCodec(); + private CameraSelectorHostApiCodec() {} } - /** Generated interface from Pigeon that represents a handler of messages from Flutter.*/ + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface CameraSelectorHostApi { void create(@NonNull Long identifier, @Nullable Long lensFacing); - @NonNull List filter(@NonNull Long identifier, @NonNull List cameraInfoIds); + + @NonNull + List filter(@NonNull Long identifier, @NonNull List cameraInfoIds); /** The codec used by CameraSelectorHostApi. */ static MessageCodec getCodec() { return CameraSelectorHostApiCodec.INSTANCE; } - /** Sets up an instance of `CameraSelectorHostApi` to handle messages through the `binaryMessenger`. */ + /** + * Sets up an instance of `CameraSelectorHostApi` to handle messages through the + * `binaryMessenger`. + */ static void setup(BinaryMessenger binaryMessenger, CameraSelectorHostApi api) { { BasicMessageChannel channel = - new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.CameraSelectorHostApi.create", getCodec()); + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.CameraSelectorHostApi.create", getCodec()); if (api != null) { - channel.setMessageHandler((message, reply) -> { - Map wrapped = new HashMap<>(); - try { - ArrayList args = (ArrayList)message; - Number identifierArg = (Number)args.get(0); - if (identifierArg == null) { - throw new NullPointerException("identifierArg unexpectedly null."); - } - Number lensFacingArg = (Number)args.get(1); - api.create((identifierArg == null) ? null : identifierArg.longValue(), (lensFacingArg == null) ? null : lensFacingArg.longValue()); - wrapped.put("result", null); - } - catch (Error | RuntimeException exception) { - wrapped.put("error", wrapError(exception)); - } - reply.reply(wrapped); - }); + channel.setMessageHandler( + (message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList) message; + Number identifierArg = (Number) args.get(0); + if (identifierArg == null) { + throw new NullPointerException("identifierArg unexpectedly null."); + } + Number lensFacingArg = (Number) args.get(1); + api.create( + (identifierArg == null) ? null : identifierArg.longValue(), + (lensFacingArg == null) ? null : lensFacingArg.longValue()); + wrapped.put("result", null); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); } else { channel.setMessageHandler(null); } } { BasicMessageChannel channel = - new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.CameraSelectorHostApi.filter", getCodec()); + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.CameraSelectorHostApi.filter", getCodec()); if (api != null) { - channel.setMessageHandler((message, reply) -> { - Map wrapped = new HashMap<>(); - try { - ArrayList args = (ArrayList)message; - Number identifierArg = (Number)args.get(0); - if (identifierArg == null) { - throw new NullPointerException("identifierArg unexpectedly null."); - } - List cameraInfoIdsArg = (List)args.get(1); - if (cameraInfoIdsArg == null) { - throw new NullPointerException("cameraInfoIdsArg unexpectedly null."); - } - List output = api.filter((identifierArg == null) ? null : identifierArg.longValue(), cameraInfoIdsArg); - wrapped.put("result", output); - } - catch (Error | RuntimeException exception) { - wrapped.put("error", wrapError(exception)); - } - reply.reply(wrapped); - }); + channel.setMessageHandler( + (message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList) message; + Number identifierArg = (Number) args.get(0); + if (identifierArg == null) { + throw new NullPointerException("identifierArg unexpectedly null."); + } + List cameraInfoIdsArg = (List) args.get(1); + if (cameraInfoIdsArg == null) { + throw new NullPointerException("cameraInfoIdsArg unexpectedly null."); + } + List output = + api.filter( + (identifierArg == null) ? null : identifierArg.longValue(), + cameraInfoIdsArg); + wrapped.put("result", output); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); } else { channel.setMessageHandler(null); } } } } + private static class CameraSelectorFlutterApiCodec extends StandardMessageCodec { - public static final CameraSelectorFlutterApiCodec INSTANCE = new CameraSelectorFlutterApiCodec(); + public static final CameraSelectorFlutterApiCodec INSTANCE = + new CameraSelectorFlutterApiCodec(); + private CameraSelectorFlutterApiCodec() {} } - /** Generated class from Pigeon that represents Flutter messages that can be called from Java.*/ + /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ public static class CameraSelectorFlutterApi { private final BinaryMessenger binaryMessenger; - public CameraSelectorFlutterApi(BinaryMessenger argBinaryMessenger){ + + public CameraSelectorFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } + public interface Reply { void reply(T reply); } + static MessageCodec getCodec() { return CameraSelectorFlutterApiCodec.INSTANCE; } - public void create(@NonNull Long identifierArg, @Nullable Long lensFacingArg, Reply callback) { + public void create( + @NonNull Long identifierArg, @Nullable Long lensFacingArg, Reply callback) { BasicMessageChannel channel = - new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.CameraSelectorFlutterApi.create", getCodec()); - channel.send(new ArrayList(Arrays.asList(identifierArg, lensFacingArg)), channelReply -> { - callback.reply(null); - }); + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.CameraSelectorFlutterApi.create", getCodec()); + channel.send( + new ArrayList(Arrays.asList(identifierArg, lensFacingArg)), + channelReply -> { + callback.reply(null); + }); } } + private static class ProcessCameraProviderHostApiCodec extends StandardMessageCodec { - public static final ProcessCameraProviderHostApiCodec INSTANCE = new ProcessCameraProviderHostApiCodec(); + public static final ProcessCameraProviderHostApiCodec INSTANCE = + new ProcessCameraProviderHostApiCodec(); + private ProcessCameraProviderHostApiCodec() {} } - /** Generated interface from Pigeon that represents a handler of messages from Flutter.*/ + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface ProcessCameraProviderHostApi { void getInstance(Result result); - @NonNull List getAvailableCameraInfos(@NonNull Long instanceId); + + @NonNull + List getAvailableCameraInfos(@NonNull Long instanceId); /** The codec used by ProcessCameraProviderHostApi. */ static MessageCodec getCodec() { return ProcessCameraProviderHostApiCodec.INSTANCE; } - /** Sets up an instance of `ProcessCameraProviderHostApi` to handle messages through the `binaryMessenger`. */ + /** + * Sets up an instance of `ProcessCameraProviderHostApi` to handle messages through the + * `binaryMessenger`. + */ static void setup(BinaryMessenger binaryMessenger, ProcessCameraProviderHostApi api) { { BasicMessageChannel channel = - new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance", getCodec()); + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance", + getCodec()); if (api != null) { - channel.setMessageHandler((message, reply) -> { - Map wrapped = new HashMap<>(); - try { - Result resultCallback = new Result() { - public void success(Long result) { - wrapped.put("result", result); - reply.reply(wrapped); - } - public void error(Throwable error) { - wrapped.put("error", wrapError(error)); + channel.setMessageHandler( + (message, reply) -> { + Map wrapped = new HashMap<>(); + try { + Result resultCallback = + new Result() { + public void success(Long result) { + wrapped.put("result", result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + wrapped.put("error", wrapError(error)); + reply.reply(wrapped); + } + }; + + api.getInstance(resultCallback); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); reply.reply(wrapped); } - }; - - api.getInstance(resultCallback); - } - catch (Error | RuntimeException exception) { - wrapped.put("error", wrapError(exception)); - reply.reply(wrapped); - } - }); + }); } else { channel.setMessageHandler(null); } } { BasicMessageChannel channel = - new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos", getCodec()); + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos", + getCodec()); if (api != null) { - channel.setMessageHandler((message, reply) -> { - Map wrapped = new HashMap<>(); - try { - ArrayList args = (ArrayList)message; - Number instanceIdArg = (Number)args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - List output = api.getAvailableCameraInfos((instanceIdArg == null) ? null : instanceIdArg.longValue()); - wrapped.put("result", output); - } - catch (Error | RuntimeException exception) { - wrapped.put("error", wrapError(exception)); - } - reply.reply(wrapped); - }); + channel.setMessageHandler( + (message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + if (instanceIdArg == null) { + throw new NullPointerException("instanceIdArg unexpectedly null."); + } + List output = + api.getAvailableCameraInfos( + (instanceIdArg == null) ? null : instanceIdArg.longValue()); + wrapped.put("result", output); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); } else { channel.setMessageHandler(null); } } } } + private static class ProcessCameraProviderFlutterApiCodec extends StandardMessageCodec { - public static final ProcessCameraProviderFlutterApiCodec INSTANCE = new ProcessCameraProviderFlutterApiCodec(); + public static final ProcessCameraProviderFlutterApiCodec INSTANCE = + new ProcessCameraProviderFlutterApiCodec(); + private ProcessCameraProviderFlutterApiCodec() {} } - /** Generated class from Pigeon that represents Flutter messages that can be called from Java.*/ + /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ public static class ProcessCameraProviderFlutterApi { private final BinaryMessenger binaryMessenger; - public ProcessCameraProviderFlutterApi(BinaryMessenger argBinaryMessenger){ + + public ProcessCameraProviderFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } + public interface Reply { void reply(T reply); } + static MessageCodec getCodec() { return ProcessCameraProviderFlutterApiCodec.INSTANCE; } public void create(@NonNull Long instanceIdArg, Reply callback) { BasicMessageChannel channel = - new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create", getCodec()); - channel.send(new ArrayList(Arrays.asList(instanceIdArg)), channelReply -> { - callback.reply(null); - }); + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create", + getCodec()); + channel.send( + new ArrayList(Arrays.asList(instanceIdArg)), + channelReply -> { + callback.reply(null); + }); } } + private static Map wrapError(Throwable exception) { Map errorMap = new HashMap<>(); errorMap.put("message", exception.toString()); errorMap.put("code", exception.getClass().getSimpleName()); - errorMap.put("details", "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + errorMap.put( + "details", + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); return errorMap; } } diff --git a/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart b/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart index a0f7b3dca518..f4654a4d7a28 100644 --- a/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart +++ b/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart @@ -18,7 +18,8 @@ class JavaObjectHostApi { /// Constructor for [JavaObjectHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - JavaObjectHostApi({BinaryMessenger? binaryMessenger}) : _binaryMessenger = binaryMessenger; + JavaObjectHostApi({BinaryMessenger? binaryMessenger}) + : _binaryMessenger = binaryMessenger; final BinaryMessenger? _binaryMessenger; @@ -26,7 +27,8 @@ class JavaObjectHostApi { Future dispose(int arg_identifier) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.JavaObjectHostApi.dispose', codec, binaryMessenger: _binaryMessenger); + 'dev.flutter.pigeon.JavaObjectHostApi.dispose', codec, + binaryMessenger: _binaryMessenger); final Map? replyMap = await channel.send([arg_identifier]) as Map?; if (replyMap == null) { @@ -35,7 +37,8 @@ class JavaObjectHostApi { message: 'Unable to establish connection on channel.', ); } else if (replyMap['error'] != null) { - final Map error = (replyMap['error'] as Map?)!; + final Map error = + (replyMap['error'] as Map?)!; throw PlatformException( code: (error['code'] as String?)!, message: error['message'] as String?, @@ -50,22 +53,27 @@ class JavaObjectHostApi { class _JavaObjectFlutterApiCodec extends StandardMessageCodec { const _JavaObjectFlutterApiCodec(); } + abstract class JavaObjectFlutterApi { static const MessageCodec codec = _JavaObjectFlutterApiCodec(); void dispose(int identifier); - static void setup(JavaObjectFlutterApi? api, {BinaryMessenger? binaryMessenger}) { + static void setup(JavaObjectFlutterApi? api, + {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.JavaObjectFlutterApi.dispose', codec, binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.JavaObjectFlutterApi.dispose', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { channel.setMessageHandler((Object? message) async { - assert(message != null, 'Argument for dev.flutter.pigeon.JavaObjectFlutterApi.dispose was null.'); + assert(message != null, + 'Argument for dev.flutter.pigeon.JavaObjectFlutterApi.dispose was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.JavaObjectFlutterApi.dispose was null, expected non-null int.'); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.JavaObjectFlutterApi.dispose was null, expected non-null int.'); api.dispose(arg_identifier!); return; }); @@ -82,7 +90,8 @@ class CameraInfoHostApi { /// Constructor for [CameraInfoHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - CameraInfoHostApi({BinaryMessenger? binaryMessenger}) : _binaryMessenger = binaryMessenger; + CameraInfoHostApi({BinaryMessenger? binaryMessenger}) + : _binaryMessenger = binaryMessenger; final BinaryMessenger? _binaryMessenger; @@ -90,7 +99,8 @@ class CameraInfoHostApi { Future getSensorRotationDegrees(int arg_identifier) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees', codec, binaryMessenger: _binaryMessenger); + 'dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees', codec, + binaryMessenger: _binaryMessenger); final Map? replyMap = await channel.send([arg_identifier]) as Map?; if (replyMap == null) { @@ -99,7 +109,8 @@ class CameraInfoHostApi { message: 'Unable to establish connection on channel.', ); } else if (replyMap['error'] != null) { - final Map error = (replyMap['error'] as Map?)!; + final Map error = + (replyMap['error'] as Map?)!; throw PlatformException( code: (error['code'] as String?)!, message: error['message'] as String?, @@ -119,22 +130,27 @@ class CameraInfoHostApi { class _CameraInfoFlutterApiCodec extends StandardMessageCodec { const _CameraInfoFlutterApiCodec(); } + abstract class CameraInfoFlutterApi { static const MessageCodec codec = _CameraInfoFlutterApiCodec(); void create(int identifier); - static void setup(CameraInfoFlutterApi? api, {BinaryMessenger? binaryMessenger}) { + static void setup(CameraInfoFlutterApi? api, + {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraInfoFlutterApi.create', codec, binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.CameraInfoFlutterApi.create', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { channel.setMessageHandler((Object? message) async { - assert(message != null, 'Argument for dev.flutter.pigeon.CameraInfoFlutterApi.create was null.'); + assert(message != null, + 'Argument for dev.flutter.pigeon.CameraInfoFlutterApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.CameraInfoFlutterApi.create was null, expected non-null int.'); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.CameraInfoFlutterApi.create was null, expected non-null int.'); api.create(arg_identifier!); return; }); @@ -151,7 +167,8 @@ class CameraSelectorHostApi { /// Constructor for [CameraSelectorHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - CameraSelectorHostApi({BinaryMessenger? binaryMessenger}) : _binaryMessenger = binaryMessenger; + CameraSelectorHostApi({BinaryMessenger? binaryMessenger}) + : _binaryMessenger = binaryMessenger; final BinaryMessenger? _binaryMessenger; @@ -159,16 +176,19 @@ class CameraSelectorHostApi { Future create(int arg_identifier, int? arg_lensFacing) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraSelectorHostApi.create', codec, binaryMessenger: _binaryMessenger); + 'dev.flutter.pigeon.CameraSelectorHostApi.create', codec, + binaryMessenger: _binaryMessenger); final Map? replyMap = - await channel.send([arg_identifier, arg_lensFacing]) as Map?; + await channel.send([arg_identifier, arg_lensFacing]) + as Map?; if (replyMap == null) { throw PlatformException( code: 'channel-error', message: 'Unable to establish connection on channel.', ); } else if (replyMap['error'] != null) { - final Map error = (replyMap['error'] as Map?)!; + final Map error = + (replyMap['error'] as Map?)!; throw PlatformException( code: (error['code'] as String?)!, message: error['message'] as String?, @@ -179,18 +199,22 @@ class CameraSelectorHostApi { } } - Future> filter(int arg_identifier, List arg_cameraInfoIds) async { + Future> filter( + int arg_identifier, List arg_cameraInfoIds) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraSelectorHostApi.filter', codec, binaryMessenger: _binaryMessenger); + 'dev.flutter.pigeon.CameraSelectorHostApi.filter', codec, + binaryMessenger: _binaryMessenger); final Map? replyMap = - await channel.send([arg_identifier, arg_cameraInfoIds]) as Map?; + await channel.send([arg_identifier, arg_cameraInfoIds]) + as Map?; if (replyMap == null) { throw PlatformException( code: 'channel-error', message: 'Unable to establish connection on channel.', ); } else if (replyMap['error'] != null) { - final Map error = (replyMap['error'] as Map?)!; + final Map error = + (replyMap['error'] as Map?)!; throw PlatformException( code: (error['code'] as String?)!, message: error['message'] as String?, @@ -210,22 +234,27 @@ class CameraSelectorHostApi { class _CameraSelectorFlutterApiCodec extends StandardMessageCodec { const _CameraSelectorFlutterApiCodec(); } + abstract class CameraSelectorFlutterApi { static const MessageCodec codec = _CameraSelectorFlutterApiCodec(); void create(int identifier, int? lensFacing); - static void setup(CameraSelectorFlutterApi? api, {BinaryMessenger? binaryMessenger}) { + static void setup(CameraSelectorFlutterApi? api, + {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraSelectorFlutterApi.create', codec, binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.CameraSelectorFlutterApi.create', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { channel.setMessageHandler((Object? message) async { - assert(message != null, 'Argument for dev.flutter.pigeon.CameraSelectorFlutterApi.create was null.'); + assert(message != null, + 'Argument for dev.flutter.pigeon.CameraSelectorFlutterApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.CameraSelectorFlutterApi.create was null, expected non-null int.'); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.CameraSelectorFlutterApi.create was null, expected non-null int.'); final int? arg_lensFacing = (args[1] as int?); api.create(arg_identifier!, arg_lensFacing); return; @@ -243,15 +272,18 @@ class ProcessCameraProviderHostApi { /// Constructor for [ProcessCameraProviderHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - ProcessCameraProviderHostApi({BinaryMessenger? binaryMessenger}) : _binaryMessenger = binaryMessenger; + ProcessCameraProviderHostApi({BinaryMessenger? binaryMessenger}) + : _binaryMessenger = binaryMessenger; final BinaryMessenger? _binaryMessenger; - static const MessageCodec codec = _ProcessCameraProviderHostApiCodec(); + static const MessageCodec codec = + _ProcessCameraProviderHostApiCodec(); Future getInstance() async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance', codec, binaryMessenger: _binaryMessenger); + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance', codec, + binaryMessenger: _binaryMessenger); final Map? replyMap = await channel.send(null) as Map?; if (replyMap == null) { @@ -260,7 +292,8 @@ class ProcessCameraProviderHostApi { message: 'Unable to establish connection on channel.', ); } else if (replyMap['error'] != null) { - final Map error = (replyMap['error'] as Map?)!; + final Map error = + (replyMap['error'] as Map?)!; throw PlatformException( code: (error['code'] as String?)!, message: error['message'] as String?, @@ -278,7 +311,9 @@ class ProcessCameraProviderHostApi { Future> getAvailableCameraInfos(int arg_instanceId) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', codec, binaryMessenger: _binaryMessenger); + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', + codec, + binaryMessenger: _binaryMessenger); final Map? replyMap = await channel.send([arg_instanceId]) as Map?; if (replyMap == null) { @@ -287,7 +322,8 @@ class ProcessCameraProviderHostApi { message: 'Unable to establish connection on channel.', ); } else if (replyMap['error'] != null) { - final Map error = (replyMap['error'] as Map?)!; + final Map error = + (replyMap['error'] as Map?)!; throw PlatformException( code: (error['code'] as String?)!, message: error['message'] as String?, @@ -307,22 +343,28 @@ class ProcessCameraProviderHostApi { class _ProcessCameraProviderFlutterApiCodec extends StandardMessageCodec { const _ProcessCameraProviderFlutterApiCodec(); } + abstract class ProcessCameraProviderFlutterApi { - static const MessageCodec codec = _ProcessCameraProviderFlutterApiCodec(); + static const MessageCodec codec = + _ProcessCameraProviderFlutterApiCodec(); void create(int instanceId); - static void setup(ProcessCameraProviderFlutterApi? api, {BinaryMessenger? binaryMessenger}) { + static void setup(ProcessCameraProviderFlutterApi? api, + {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create', codec, binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { channel.setMessageHandler((Object? message) async { - assert(message != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create was null.'); + assert(message != null, + 'Argument for dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create was null.'); final List args = (message as List?)!; final int? arg_instanceId = (args[0] as int?); - assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create was null, expected non-null int.'); + assert(arg_instanceId != null, + 'Argument for dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create was null, expected non-null int.'); api.create(arg_instanceId!); return; }); diff --git a/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart b/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart index b40f7db8ae81..1e8fa4ba1b2b 100644 --- a/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart +++ b/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart @@ -16,22 +16,27 @@ import 'package:camera_android_camerax/src/camerax_library.pigeon.dart'; class _TestJavaObjectHostApiCodec extends StandardMessageCodec { const _TestJavaObjectHostApiCodec(); } + abstract class TestJavaObjectHostApi { static const MessageCodec codec = _TestJavaObjectHostApiCodec(); void dispose(int identifier); - static void setup(TestJavaObjectHostApi? api, {BinaryMessenger? binaryMessenger}) { + static void setup(TestJavaObjectHostApi? api, + {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.JavaObjectHostApi.dispose', codec, binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.JavaObjectHostApi.dispose', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { channel.setMockMessageHandler((Object? message) async { - assert(message != null, 'Argument for dev.flutter.pigeon.JavaObjectHostApi.dispose was null.'); + assert(message != null, + 'Argument for dev.flutter.pigeon.JavaObjectHostApi.dispose was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.JavaObjectHostApi.dispose was null, expected non-null int.'); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.JavaObjectHostApi.dispose was null, expected non-null int.'); api.dispose(arg_identifier!); return {}; }); @@ -43,22 +48,28 @@ abstract class TestJavaObjectHostApi { class _TestCameraInfoHostApiCodec extends StandardMessageCodec { const _TestCameraInfoHostApiCodec(); } + abstract class TestCameraInfoHostApi { static const MessageCodec codec = _TestCameraInfoHostApiCodec(); int getSensorRotationDegrees(int identifier); - static void setup(TestCameraInfoHostApi? api, {BinaryMessenger? binaryMessenger}) { + static void setup(TestCameraInfoHostApi? api, + {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees', codec, binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees', + codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { channel.setMockMessageHandler((Object? message) async { - assert(message != null, 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees was null.'); + assert(message != null, + 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees was null, expected non-null int.'); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees was null, expected non-null int.'); final int output = api.getSensorRotationDegrees(arg_identifier!); return {'result': output}; }); @@ -70,23 +81,28 @@ abstract class TestCameraInfoHostApi { class _TestCameraSelectorHostApiCodec extends StandardMessageCodec { const _TestCameraSelectorHostApiCodec(); } + abstract class TestCameraSelectorHostApi { static const MessageCodec codec = _TestCameraSelectorHostApiCodec(); void create(int identifier, int? lensFacing); List filter(int identifier, List cameraInfoIds); - static void setup(TestCameraSelectorHostApi? api, {BinaryMessenger? binaryMessenger}) { + static void setup(TestCameraSelectorHostApi? api, + {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraSelectorHostApi.create', codec, binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.CameraSelectorHostApi.create', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { channel.setMockMessageHandler((Object? message) async { - assert(message != null, 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.create was null.'); + assert(message != null, + 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.create was null, expected non-null int.'); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.create was null, expected non-null int.'); final int? arg_lensFacing = (args[1] as int?); api.create(arg_identifier!, arg_lensFacing); return {}; @@ -95,18 +111,24 @@ abstract class TestCameraSelectorHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.CameraSelectorHostApi.filter', codec, binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.CameraSelectorHostApi.filter', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { channel.setMockMessageHandler((Object? message) async { - assert(message != null, 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null.'); + assert(message != null, + 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); - assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null, expected non-null int.'); - final List? arg_cameraInfoIds = (args[1] as List?)?.cast(); - assert(arg_cameraInfoIds != null, 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null, expected non-null List.'); - final List output = api.filter(arg_identifier!, arg_cameraInfoIds!); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null, expected non-null int.'); + final List? arg_cameraInfoIds = + (args[1] as List?)?.cast(); + assert(arg_cameraInfoIds != null, + 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null, expected non-null List.'); + final List output = + api.filter(arg_identifier!, arg_cameraInfoIds!); return {'result': output}; }); } @@ -117,15 +139,19 @@ abstract class TestCameraSelectorHostApi { class _TestProcessCameraProviderHostApiCodec extends StandardMessageCodec { const _TestProcessCameraProviderHostApiCodec(); } + abstract class TestProcessCameraProviderHostApi { - static const MessageCodec codec = _TestProcessCameraProviderHostApiCodec(); + static const MessageCodec codec = + _TestProcessCameraProviderHostApiCodec(); Future getInstance(); List getAvailableCameraInfos(int instanceId); - static void setup(TestProcessCameraProviderHostApi? api, {BinaryMessenger? binaryMessenger}) { + static void setup(TestProcessCameraProviderHostApi? api, + {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance', codec, binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -138,16 +164,21 @@ abstract class TestProcessCameraProviderHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', codec, binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', + codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { channel.setMockMessageHandler((Object? message) async { - assert(message != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos was null.'); + assert(message != null, + 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos was null.'); final List args = (message as List?)!; final int? arg_instanceId = (args[0] as int?); - assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos was null, expected non-null int.'); - final List output = api.getAvailableCameraInfos(arg_instanceId!); + assert(arg_instanceId != null, + 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos was null, expected non-null int.'); + final List output = + api.getAvailableCameraInfos(arg_instanceId!); return {'result': output}; }); } From da7ffdb6af67ab7fc6bfb13ebc8dba8907cc1dcf Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 26 Sep 2022 08:49:35 -0700 Subject: [PATCH 06/17] Format and revise --- .../camerax/CameraAndroidCameraxPlugin.java | 30 +++++++++++++++---- .../camerax/GeneratedCameraXLibrary.java | 14 ++++----- .../ProcessCameraProviderHostApiImpl.java | 12 ++++++-- .../lib/src/camerax_library.pigeon.dart | 12 ++++---- .../pigeons/camerax_library.dart | 4 +-- .../process_camera_provider_test.mocks.dart | 4 +-- .../test/test_camerax_library.pigeon.dart | 8 ++--- 7 files changed, 54 insertions(+), 30 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 c9f05836d789..fd8b278d5f29 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 @@ public final class CameraAndroidCameraxPlugin implements FlutterPlugin, ActivityAware { private InstanceManager instanceManager; private FlutterPluginBinding pluginBinding; + private ProcessCameraProviderHostApiImpl processCameraProviderHostApi; /** * Initialize this within the {@code #configureFlutterEngine} of a Flutter activity or fragment. @@ -39,9 +40,10 @@ void setUp(BinaryMessenger binaryMessenger, Context context) { binaryMessenger, new JavaObjectHostApiImpl(instanceManager)); GeneratedCameraXLibrary.CameraSelectorHostApi.setup( binaryMessenger, new CameraSelectorHostApiImpl(binaryMessenger, instanceManager)); + processCameraProviderHostApi = + new ProcessCameraProviderHostApiImpl(binaryMessenger, instanceManager, context); GeneratedCameraXLibrary.ProcessCameraProviderHostApi.setup( - binaryMessenger, - new ProcessCameraProviderHostApiImpl(binaryMessenger, instanceManager, context)); + binaryMessenger, processCameraProviderHostApi); } @Override @@ -63,15 +65,31 @@ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { // Activity Lifecycle methods: @Override - public void onAttachedToActivity(@NonNull ActivityPluginBinding activityPluginBinding) {} + public void onAttachedToActivity(@NonNull ActivityPluginBinding activityPluginBinding) { + updateContext(activityPluginBinding.getActivity()); + } @Override - public void onDetachedFromActivityForConfigChanges() {} + public void onDetachedFromActivityForConfigChanges() { + updateContext(pluginBinding.getApplicationContext()); + } @Override public void onReattachedToActivityForConfigChanges( - @NonNull ActivityPluginBinding activityPluginBinding) {} + @NonNull ActivityPluginBinding activityPluginBinding) { + updateContext(activityPluginBinding.getActivity()); + } @Override - public void onDetachedFromActivity() {} + public void onDetachedFromActivity() { + updateContext(pluginBinding.getApplicationContext()); + } + + /** + * Updates context that is used to fetch the corresponding instance of a{@code + * ProcessCameraProvider}. + */ + private void updateContext(Context context) { + processCameraProviderHostApi.setContext(context); + } } 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 d8e95cef99a3..041564c3bfcb 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 @@ -330,7 +330,7 @@ public interface ProcessCameraProviderHostApi { void getInstance(Result result); @NonNull - List getAvailableCameraInfos(@NonNull Long instanceId); + List getAvailableCameraInfos(@NonNull Long identifier); /** The codec used by ProcessCameraProviderHostApi. */ static MessageCodec getCodec() { @@ -388,13 +388,13 @@ public void error(Throwable error) { Map wrapped = new HashMap<>(); try { ArrayList args = (ArrayList) message; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); + Number identifierArg = (Number) args.get(0); + if (identifierArg == null) { + throw new NullPointerException("identifierArg unexpectedly null."); } List output = api.getAvailableCameraInfos( - (instanceIdArg == null) ? null : instanceIdArg.longValue()); + (identifierArg == null) ? null : identifierArg.longValue()); wrapped.put("result", output); } catch (Error | RuntimeException exception) { wrapped.put("error", wrapError(exception)); @@ -431,14 +431,14 @@ static MessageCodec getCodec() { return ProcessCameraProviderFlutterApiCodec.INSTANCE; } - public void create(@NonNull Long instanceIdArg, Reply callback) { + public void create(@NonNull Long identifierArg, Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create", getCodec()); channel.send( - new ArrayList(Arrays.asList(instanceIdArg)), + new ArrayList(Arrays.asList(identifierArg)), channelReply -> { callback.reply(null); }); diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java index a3298ec6ae35..3edaa325952b 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java @@ -28,7 +28,13 @@ public ProcessCameraProviderHostApiImpl( this.context = context; } - // TODO(cs): Add documentation about this + /** + * Sets the context that the {@code ProcessCameraProvider} will use to attach the lifecycle of the + * camera to. + * + *

If using the camera plugin in an add-to-app context, ensure that a new instance of the + * {@code ProcessCameraProvider} is fetched via {@code #getInstance} anytime the context changes. + */ public void setContext(Context context) { this.context = context; } @@ -60,9 +66,9 @@ public void getInstance(GeneratedCameraXLibrary.Result result) { /** Returns cameras available to the ProcessCameraProvider. */ @Override - public List getAvailableCameraInfos(@NonNull Long instanceId) { + public List getAvailableCameraInfos(@NonNull Long identifier) { ProcessCameraProvider processCameraProvider = - (ProcessCameraProvider) instanceManager.getInstance(instanceId); + (ProcessCameraProvider) instanceManager.getInstance(identifier); List availableCameras = processCameraProvider.getAvailableCameraInfos(); List availableCamerasIds = new ArrayList(); diff --git a/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart b/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart index f4654a4d7a28..c0b052378def 100644 --- a/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart +++ b/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart @@ -309,13 +309,13 @@ class ProcessCameraProviderHostApi { } } - Future> getAvailableCameraInfos(int arg_instanceId) async { + Future> getAvailableCameraInfos(int arg_identifier) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', codec, binaryMessenger: _binaryMessenger); final Map? replyMap = - await channel.send([arg_instanceId]) as Map?; + await channel.send([arg_identifier]) as Map?; if (replyMap == null) { throw PlatformException( code: 'channel-error', @@ -348,7 +348,7 @@ abstract class ProcessCameraProviderFlutterApi { static const MessageCodec codec = _ProcessCameraProviderFlutterApiCodec(); - void create(int instanceId); + void create(int identifier); static void setup(ProcessCameraProviderFlutterApi? api, {BinaryMessenger? binaryMessenger}) { { @@ -362,10 +362,10 @@ abstract class ProcessCameraProviderFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create was null.'); final List args = (message as List?)!; - final int? arg_instanceId = (args[0] as int?); - assert(arg_instanceId != null, + final int? arg_identifier = (args[0] as int?); + assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create was null, expected non-null int.'); - api.create(arg_instanceId!); + api.create(arg_identifier!); return; }); } diff --git a/packages/camera/camera_android_camerax/pigeons/camerax_library.dart b/packages/camera/camera_android_camerax/pigeons/camerax_library.dart index 61d18d4dedae..4d7d96910246 100644 --- a/packages/camera/camera_android_camerax/pigeons/camerax_library.dart +++ b/packages/camera/camera_android_camerax/pigeons/camerax_library.dart @@ -63,10 +63,10 @@ abstract class ProcessCameraProviderHostApi { @async int getInstance(); - List getAvailableCameraInfos(int instanceId); + List getAvailableCameraInfos(int identifier); } @FlutterApi() abstract class ProcessCameraProviderFlutterApi { - void create(int instanceId); + void create(int identifier); } diff --git a/packages/camera/camera_android_camerax/test/process_camera_provider_test.mocks.dart b/packages/camera/camera_android_camerax/test/process_camera_provider_test.mocks.dart index 923058880572..9fcfe690c062 100644 --- a/packages/camera/camera_android_camerax/test/process_camera_provider_test.mocks.dart +++ b/packages/camera/camera_android_camerax/test/process_camera_provider_test.mocks.dart @@ -34,7 +34,7 @@ class MockTestProcessCameraProviderHostApi extends _i1.Mock (super.noSuchMethod(Invocation.method(#getInstance, []), returnValue: _i3.Future.value(0)) as _i3.Future); @override - List getAvailableCameraInfos(int? instanceId) => (super.noSuchMethod( - Invocation.method(#getAvailableCameraInfos, [instanceId]), + List getAvailableCameraInfos(int? identifier) => (super.noSuchMethod( + Invocation.method(#getAvailableCameraInfos, [identifier]), returnValue: []) as List); } diff --git a/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart b/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart index 1e8fa4ba1b2b..2196b73d7fdb 100644 --- a/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart +++ b/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart @@ -145,7 +145,7 @@ abstract class TestProcessCameraProviderHostApi { _TestProcessCameraProviderHostApiCodec(); Future getInstance(); - List getAvailableCameraInfos(int instanceId); + List getAvailableCameraInfos(int identifier); static void setup(TestProcessCameraProviderHostApi? api, {BinaryMessenger? binaryMessenger}) { { @@ -174,11 +174,11 @@ abstract class TestProcessCameraProviderHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos was null.'); final List args = (message as List?)!; - final int? arg_instanceId = (args[0] as int?); - assert(arg_instanceId != null, + final int? arg_identifier = (args[0] as int?); + assert(arg_identifier != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos was null, expected non-null int.'); final List output = - api.getAvailableCameraInfos(arg_instanceId!); + api.getAvailableCameraInfos(arg_identifier!); return {'result': output}; }); } From 3a54741b1b9ce7c0dec4c9155b6a2cdaead3c871 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 26 Sep 2022 10:12:59 -0700 Subject: [PATCH 07/17] Fix test --- .../camera_android_camerax/android/build.gradle | 2 ++ .../camerax/ProcessCameraProviderHostApiImpl.java | 11 +++++++---- .../lib/src/process_camera_provider.dart | 6 ++++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/camera/camera_android_camerax/android/build.gradle b/packages/camera/camera_android_camerax/android/build.gradle index 1772afebe429..c02b0de215ac 100644 --- a/packages/camera/camera_android_camerax/android/build.gradle +++ b/packages/camera/camera_android_camerax/android/build.gradle @@ -42,9 +42,11 @@ dependencies { implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" implementation "androidx.camera:camera-lifecycle:${camerax_version}" + implementation 'com.google.guava:guava:28.1-android' testImplementation 'junit:junit:4.13.2' testImplementation 'org.mockito:mockito-inline:4.7.0' testImplementation 'androidx.test:core:1.4.0' + testImplementation 'org.robolectric:robolectric:4.3' } testOptions { unitTests.includeAndroidResources = true diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java index 3edaa325952b..02173add8721 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java @@ -39,17 +39,20 @@ public void setContext(Context context) { this.context = context; } - /** Returns the instance of the ProcessCameraProvider. */ + /** + * Returns the instance of the ProcessCameraProvider to manage the lifecycle of the camera for the + * supplied {@code Context}. + */ @Override public void getInstance(GeneratedCameraXLibrary.Result result) { - ListenableFuture cameraProviderFuture = + ListenableFuture processCameraProviderFuture = ProcessCameraProvider.getInstance(context); - cameraProviderFuture.addListener( + processCameraProviderFuture.addListener( () -> { try { // Camera provider is now guaranteed to be available. - ProcessCameraProvider processCameraProvider = cameraProviderFuture.get(); + ProcessCameraProvider processCameraProvider = processCameraProviderFuture.get(); if (!instanceManager.containsInstance(processCameraProvider)) { final ProcessCameraProviderFlutterApiImpl flutterApi = diff --git a/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart b/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart index 270a846841d8..e2b588d15faa 100644 --- a/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart +++ b/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart @@ -107,10 +107,12 @@ class ProcessCameraProviderFlutterApiImpl @override void create(int identifier) { instanceManager.addHostCreatedInstance( - ProcessCameraProvider.detached(), + ProcessCameraProvider.detached( + binaryMessenger: binaryMessenger, instanceManager: instanceManager), identifier, onCopy: (ProcessCameraProvider original) { - return ProcessCameraProvider.detached(); + return ProcessCameraProvider.detached( + binaryMessenger: binaryMessenger, instanceManager: instanceManager); }, ); } From ecf4848161ce4925885c3b250672f186e99a95cc Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 26 Sep 2022 10:16:18 -0700 Subject: [PATCH 08/17] My revisions --- .../io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java | 2 +- .../plugins/camerax/ProcessCameraProviderHostApiImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 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 fd8b278d5f29..ee0fd3e4c567 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 @@ -86,7 +86,7 @@ public void onDetachedFromActivity() { } /** - * Updates context that is used to fetch the corresponding instance of a{@code + * Updates context that is used to fetch the corresponding instance of a {@code * ProcessCameraProvider}. */ private void updateContext(Context context) { diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java index 02173add8721..19c5eb5b3f70 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java @@ -41,7 +41,7 @@ public void setContext(Context context) { /** * Returns the instance of the ProcessCameraProvider to manage the lifecycle of the camera for the - * supplied {@code Context}. + * current {@code Context}. */ @Override public void getInstance(GeneratedCameraXLibrary.Result result) { From 98a3420a6b62a7bf69a3cbfb0f4f568ef8ed46e1 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 26 Sep 2022 10:23:23 -0700 Subject: [PATCH 09/17] Fix analyze: --- .../test/process_camera_provider_test.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera_android_camerax/test/process_camera_provider_test.dart b/packages/camera/camera_android_camerax/test/process_camera_provider_test.dart index 8f635ff68802..65e7d00ddaea 100644 --- a/packages/camera/camera_android_camerax/test/process_camera_provider_test.dart +++ b/packages/camera/camera_android_camerax/test/process_camera_provider_test.dart @@ -3,9 +3,8 @@ // found in the LICENSE file. import 'package:camera_android_camerax/src/camera_info.dart'; -import 'package:camera_android_camerax/src/process_camera_provider.dart'; -import 'package:camera_android_camerax/src/camerax_library.pigeon.dart'; import 'package:camera_android_camerax/src/instance_manager.dart'; +import 'package:camera_android_camerax/src/process_camera_provider.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; @@ -65,7 +64,7 @@ void main() { 0, onCopy: (_) => ProcessCameraProvider.detached(), ); - CameraInfo fakeAvailableCameraInfo = + final CameraInfo fakeAvailableCameraInfo = CameraInfo.detached(instanceManager: instanceManager); instanceManager.addHostCreatedInstance( fakeAvailableCameraInfo, From c7deeee2f19201f685fb5728a7eb64e5b27e1a84 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 26 Sep 2022 10:24:52 -0700 Subject: [PATCH 10/17] Update changelog --- packages/camera/camera_android_camerax/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 2bdfa594b3be..ce2fb9046c69 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -3,3 +3,4 @@ * Creates camera_android_camerax plugin for development. * Adds CameraInfo class and removes unnecessary code from plugin. * Adds CameraSelector class. +* Adds ProcessCameraProvider class. From fb25d846447fca8b876fd4bec23ea61f6accdeeb Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 27 Sep 2022 04:56:23 -0700 Subject: [PATCH 11/17] Add null check --- .../flutter/plugins/camerax/CameraAndroidCameraxPlugin.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 ee0fd3e4c567..b8fbaf539c32 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 @@ -90,6 +90,8 @@ public void onDetachedFromActivity() { * ProcessCameraProvider}. */ private void updateContext(Context context) { - processCameraProviderHostApi.setContext(context); + if (processCameraProviderHostApi != null) { + processCameraProviderHostApi.setContext(context); + } } } From a47c772e8d9c6025dfa5efaa97031892ad3f64b2 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 27 Sep 2022 05:10:12 -0700 Subject: [PATCH 12/17] Bump camx dependency versions --- packages/camera/camera_android_camerax/android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/android/build.gradle b/packages/camera/camera_android_camerax/android/build.gradle index c02b0de215ac..a193a298c640 100644 --- a/packages/camera/camera_android_camerax/android/build.gradle +++ b/packages/camera/camera_android_camerax/android/build.gradle @@ -38,7 +38,7 @@ android { dependencies { // CameraX core library using the camera2 implementation must use same version number. - def camerax_version = "1.2.0-beta01" + def camerax_version = "1.2.0-beta02" implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" implementation "androidx.camera:camera-lifecycle:${camerax_version}" From d7404094a439906a74de5775ba897ed6b9094821 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 27 Sep 2022 11:00:55 -0700 Subject: [PATCH 13/17] Add test --- .../camerax/ProcessCameraProviderTest.java | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/ProcessCameraProviderTest.java diff --git a/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/ProcessCameraProviderTest.java b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/ProcessCameraProviderTest.java new file mode 100644 index 000000000000..ec321f8dbfea --- /dev/null +++ b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/ProcessCameraProviderTest.java @@ -0,0 +1,106 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.camerax; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import androidx.camera.core.CameraInfo; +import androidx.camera.lifecycle.ProcessCameraProvider; +import androidx.test.core.app.ApplicationProvider; +import com.google.common.util.concurrent.SettableFuture; +import io.flutter.plugin.common.BinaryMessenger; +import java.util.Arrays; +import java.util.Objects; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class ProcessCameraProviderTest { + @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Mock public ProcessCameraProvider processCameraProvider; + @Mock public BinaryMessenger mockBinaryMessenger; + + InstanceManager testInstanceManager; + private Context context; + + @Before + public void setUp() { + testInstanceManager = InstanceManager.open(identifier -> {}); + context = ApplicationProvider.getApplicationContext(); + } + + @After + public void tearDown() { + testInstanceManager.close(); + } + + @Test + public void getInstanceTest() { + final ProcessCameraProviderHostApiImpl processCameraProviderHostApi = + new ProcessCameraProviderHostApiImpl(mockBinaryMessenger, testInstanceManager, context); + SettableFuture processCameraProviderFuture = SettableFuture.create(); + processCameraProviderFuture.set(processCameraProvider); + final GeneratedCameraXLibrary.Result mockResult = + mock(GeneratedCameraXLibrary.Result.class); + + testInstanceManager.addDartCreatedInstance(processCameraProvider, 0); + + try (MockedStatic mockedProcessCameraProvider = + Mockito.mockStatic(ProcessCameraProvider.class)) { + mockedProcessCameraProvider + .when(() -> ProcessCameraProvider.getInstance(context)) + .thenAnswer((Answer) invocation -> processCameraProviderFuture); + + processCameraProviderHostApi.getInstance(mockResult); + verify(mockResult).success(0L); + } + } + + @Test + public void getAvailableCameraInfosTest() { + final ProcessCameraProviderHostApiImpl processCameraProviderHostApi = + new ProcessCameraProviderHostApiImpl(mockBinaryMessenger, testInstanceManager, context); + final CameraInfo mockCameraInfo = mock(CameraInfo.class); + + testInstanceManager.addDartCreatedInstance(processCameraProvider, 0); + testInstanceManager.addDartCreatedInstance(mockCameraInfo, 1); + + when(processCameraProvider.getAvailableCameraInfos()).thenReturn(Arrays.asList(mockCameraInfo)); + + assertEquals(processCameraProviderHostApi.getAvailableCameraInfos(0L), Arrays.asList(1L)); + verify(processCameraProvider).getAvailableCameraInfos(); + } + + @Test + public void flutterApiCreateTest() { + final ProcessCameraProviderFlutterApiImpl spyFlutterApi = + spy(new ProcessCameraProviderFlutterApiImpl(mockBinaryMessenger, testInstanceManager)); + + spyFlutterApi.create(processCameraProvider, reply -> {}); + + final long identifier = + Objects.requireNonNull( + testInstanceManager.getIdentifierForStrongReference(processCameraProvider)); + verify(spyFlutterApi).create(eq(identifier), any()); + } +} From e1dd896659335e3cb95d6b411c13041c84b917ae Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Sep 2022 04:08:54 -0700 Subject: [PATCH 14/17] Bump version and move dependencies block --- .../android/build.gradle | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/camera/camera_android_camerax/android/build.gradle b/packages/camera/camera_android_camerax/android/build.gradle index a193a298c640..22fc10bf9f5c 100644 --- a/packages/camera/camera_android_camerax/android/build.gradle +++ b/packages/camera/camera_android_camerax/android/build.gradle @@ -36,18 +36,6 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } -dependencies { - // CameraX core library using the camera2 implementation must use same version number. - def camerax_version = "1.2.0-beta02" - implementation "androidx.camera:camera-core:${camerax_version}" - implementation "androidx.camera:camera-camera2:${camerax_version}" - implementation "androidx.camera:camera-lifecycle:${camerax_version}" - implementation 'com.google.guava:guava:28.1-android' - testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-inline:4.7.0' - testImplementation 'androidx.test:core:1.4.0' - testImplementation 'org.robolectric:robolectric:4.3' -} testOptions { unitTests.includeAndroidResources = true unitTests.returnDefaultValues = true @@ -60,3 +48,16 @@ dependencies { } } } + +dependencies { + // CameraX core library using the camera2 implementation must use same version number. + def camerax_version = "1.2.0-beta02" + implementation "androidx.camera:camera-core:${camerax_version}" + implementation "androidx.camera:camera-camera2:${camerax_version}" + implementation "androidx.camera:camera-lifecycle:${camerax_version}" + implementation 'com.google.guava:guava:28.1-android' + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.mockito:mockito-inline:4.7.0' + testImplementation 'androidx.test:core:1.4.0' + testImplementation 'org.robolectric:robolectric:4.8' +} From cb0138563e5daaff924be0767360e867fa8de996 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Thu, 29 Sep 2022 08:38:23 -0700 Subject: [PATCH 15/17] Bump versions and fix test --- .../camera_android_camerax/android/build.gradle | 2 +- .../camerax/ProcessCameraProviderTest.java | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/camera/camera_android_camerax/android/build.gradle b/packages/camera/camera_android_camerax/android/build.gradle index 22fc10bf9f5c..b4209bbe62a6 100644 --- a/packages/camera/camera_android_camerax/android/build.gradle +++ b/packages/camera/camera_android_camerax/android/build.gradle @@ -55,7 +55,7 @@ dependencies { implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" implementation "androidx.camera:camera-lifecycle:${camerax_version}" - implementation 'com.google.guava:guava:28.1-android' + implementation 'com.google.guava:guava:31.1-android' testImplementation 'junit:junit:4.13.2' testImplementation 'org.mockito:mockito-inline:4.7.0' testImplementation 'androidx.test:core:1.4.0' diff --git a/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/ProcessCameraProviderTest.java b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/ProcessCameraProviderTest.java index ec321f8dbfea..5008e4ef34b0 100644 --- a/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/ProcessCameraProviderTest.java +++ b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/ProcessCameraProviderTest.java @@ -16,7 +16,8 @@ import androidx.camera.core.CameraInfo; import androidx.camera.lifecycle.ProcessCameraProvider; import androidx.test.core.app.ApplicationProvider; -import com.google.common.util.concurrent.SettableFuture; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; import io.flutter.plugin.common.BinaryMessenger; import java.util.Arrays; import java.util.Objects; @@ -25,6 +26,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockedStatic; import org.mockito.Mockito; @@ -58,8 +60,8 @@ public void tearDown() { public void getInstanceTest() { final ProcessCameraProviderHostApiImpl processCameraProviderHostApi = new ProcessCameraProviderHostApiImpl(mockBinaryMessenger, testInstanceManager, context); - SettableFuture processCameraProviderFuture = SettableFuture.create(); - processCameraProviderFuture.set(processCameraProvider); + final ListenableFuture processCameraProviderFuture = + spy(Futures.immediateFuture(processCameraProvider)); final GeneratedCameraXLibrary.Result mockResult = mock(GeneratedCameraXLibrary.Result.class); @@ -69,9 +71,15 @@ public void getInstanceTest() { Mockito.mockStatic(ProcessCameraProvider.class)) { mockedProcessCameraProvider .when(() -> ProcessCameraProvider.getInstance(context)) - .thenAnswer((Answer) invocation -> processCameraProviderFuture); + .thenAnswer( + (Answer>) + invocation -> processCameraProviderFuture); + + final ArgumentCaptor runnableCaptor = ArgumentCaptor.forClass(Runnable.class); processCameraProviderHostApi.getInstance(mockResult); + verify(processCameraProviderFuture).addListener(runnableCaptor.capture(), any()); + runnableCaptor.getValue().run(); verify(mockResult).success(0L); } } From 1e2e95f2196f4193340caaf1441ba66279da3ece Mon Sep 17 00:00:00 2001 From: camsim99 Date: Thu, 29 Sep 2022 08:49:19 -0700 Subject: [PATCH 16/17] Formatting --- .../lib/src/android_camera_camerax_flutter_api_impls.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart index 4e63ba994583..2a8377bfbfa4 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart @@ -23,7 +23,8 @@ class AndroidCameraXCameraFlutterApis { cameraInfoFlutterApi ?? CameraInfoFlutterApiImpl(); this.cameraSelectorFlutterApi = cameraSelectorFlutterApi ?? CameraSelectorFlutterApiImpl(); - this.processCameraProviderFlutterApi ?? ProcessCameraProviderFlutterApiImpl(); + this.processCameraProviderFlutterApi ?? + ProcessCameraProviderFlutterApiImpl(); } static bool _haveBeenSetUp = false; From 3c6b386d264548d8bbfa31bec4de7dce202881b3 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Thu, 29 Sep 2022 08:54:56 -0700 Subject: [PATCH 17/17] Fix rebase --- .../lib/src/android_camera_camerax_flutter_api_impls.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart index 2a8377bfbfa4..9c6564a06c08 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart @@ -23,7 +23,7 @@ class AndroidCameraXCameraFlutterApis { cameraInfoFlutterApi ?? CameraInfoFlutterApiImpl(); this.cameraSelectorFlutterApi = cameraSelectorFlutterApi ?? CameraSelectorFlutterApiImpl(); - this.processCameraProviderFlutterApi ?? + this.processCameraProviderFlutterApi = processCameraProviderFlutterApi ?? ProcessCameraProviderFlutterApiImpl(); }