From dec3d697b4622d0edc5f7665215bda6f06706258 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 1 May 2023 16:34:43 -0700 Subject: [PATCH 01/28] Merge remote-tracking branch 'upstream/main' into camx_occ --- .../camera_android_camerax/CHANGELOG.md | 1 + .../camerax/CameraInfoHostApiImpl.java | 38 ++ .../camerax/GeneratedCameraXLibrary.java | 627 ++++++++++-------- .../plugins/camerax/CameraInfoTest.java | 1 + .../lib/src/android_camera_camerax.dart | 55 ++ ...roid_camera_camerax_flutter_api_impls.dart | 70 +- .../lib/src/camera_info.dart | 22 + .../lib/src/camerax_library.g.dart | 327 ++++++--- .../pigeons/camerax_library.dart | 25 + .../test/android_camera_camerax_test.dart | 65 +- .../android_camera_camerax_test.mocks.dart | 9 + .../test/camera_info_test.dart | 1 + .../test/camera_info_test.mocks.dart | 8 + .../test/camera_test.dart | 4 +- .../test/test_camerax_library.g.dart | 431 +++++------- 15 files changed, 977 insertions(+), 707 deletions(-) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 1c901a82bfac..24fbec47e8b7 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -21,3 +21,4 @@ * Implements image streaming. * Provides LifecycleOwner implementation for Activities that use the plugin that do not implement it themselves. * Implements retrieval of camera information. +* Implements onCameraClosing callback method for indicating the camera is closing and bumps CameraX version to 1.3.0-alpha05. diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoHostApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoHostApiImpl.java index f9fd7722fc87..973e2928d789 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoHostApiImpl.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoHostApiImpl.java @@ -6,8 +6,10 @@ import androidx.annotation.NonNull; import androidx.camera.core.CameraInfo; +import androidx.camera.core.CameraState; import androidx.camera.core.ExposureState; import androidx.camera.core.ZoomState; +import androidx.lifecycle.LiveData; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugins.camerax.GeneratedCameraXLibrary.CameraInfoHostApi; import java.util.Objects; @@ -66,4 +68,40 @@ public Long getZoomState(@NonNull Long identifier) { return instanceManager.getIdentifierForStrongReference(zoomState); } + + /** + * Retrieves the {@link ExposureState} of the {@link CameraInfo} with the specified identifier. + */ + @Override + @NonNull + public Long getExposureState(@NonNull Long identifier) { + CameraInfo cameraInfo = + (CameraInfo) Objects.requireNonNull(instanceManager.getInstance(identifier)); + ExposureState exposureState = cameraInfo.getExposureState(); + + ExposureStateFlutterApiImpl exposureStateFlutterApiImpl = + new ExposureStateFlutterApiImpl(binaryMessenger, instanceManager); + exposureStateFlutterApiImpl.create(exposureState, result -> {}); + + return instanceManager.getIdentifierForStrongReference(exposureState); + } + + /** + * Retrieves the current {@link ZoomState} value of the {@link CameraInfo} with the specified + * identifier. + */ + @NonNull + @Override + public Long getZoomState(@NonNull Long identifier) { + CameraInfo cameraInfo = + (CameraInfo) Objects.requireNonNull(instanceManager.getInstance(identifier)); + // TODO(camsim99): Create/return LiveData once https://github.com/flutter/packages/pull/3419 lands. + ZoomState zoomState = cameraInfo.getZoomState().getValue(); + + ZoomStateFlutterApiImpl zoomStateFlutterApiImpl = + new ZoomStateFlutterApiImpl(binaryMessenger, instanceManager); + zoomStateFlutterApiImpl.create(zoomState, result -> {}); + + return instanceManager.getIdentifierForStrongReference(zoomState); + } } 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 882c1d146323..d48feb044a36 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 @@ -18,7 +18,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** Generated class from Pigeon. */ @SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) @@ -33,7 +35,8 @@ public static class FlutterError extends RuntimeException { /** The error details. Must be a datatype supported by the api codec. */ public final Object details; - public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) { + public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) + { super(message); this.code = code; this.details = details; @@ -52,7 +55,7 @@ protected static ArrayList wrapError(@NonNull Throwable exception) { errorList.add(exception.toString()); errorList.add(exception.getClass().getSimpleName()); errorList.add( - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); } return errorList; } @@ -123,13 +126,9 @@ ArrayList toList() { static @NonNull ResolutionInfo fromList(@NonNull ArrayList list) { ResolutionInfo pigeonResult = new ResolutionInfo(); Object width = list.get(0); - pigeonResult.setWidth( - (width == null) ? null : ((width instanceof Integer) ? (Integer) width : (Long) width)); + pigeonResult.setWidth((width == null) ? null : ((width instanceof Integer) ? (Integer) width : (Long) width)); Object height = list.get(1); - pigeonResult.setHeight( - (height == null) - ? null - : ((height instanceof Integer) ? (Integer) height : (Long) height)); + pigeonResult.setHeight((height == null) ? null : ((height instanceof Integer) ? (Integer) height : (Long) height)); return pigeonResult; } } @@ -273,19 +272,82 @@ ArrayList toList() { static @NonNull ExposureCompensationRange fromList(@NonNull ArrayList list) { ExposureCompensationRange pigeonResult = new ExposureCompensationRange(); Object minCompensation = list.get(0); - pigeonResult.setMinCompensation( - (minCompensation == null) - ? null - : ((minCompensation instanceof Integer) - ? (Integer) minCompensation - : (Long) minCompensation)); + pigeonResult.setMinCompensation((minCompensation == null) ? null : ((minCompensation instanceof Integer) ? (Integer) minCompensation : (Long) minCompensation)); Object maxCompensation = list.get(1); - pigeonResult.setMaxCompensation( - (maxCompensation == null) - ? null - : ((maxCompensation instanceof Integer) - ? (Integer) maxCompensation - : (Long) maxCompensation)); + pigeonResult.setMaxCompensation((maxCompensation == null) ? null : ((maxCompensation instanceof Integer) ? (Integer) maxCompensation : (Long) maxCompensation)); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class ExposureCompensationRange { + private @NonNull Long minCompensation; + + public @NonNull Long getMinCompensation() { + return minCompensation; + } + + public void setMinCompensation(@NonNull Long setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"minCompensation\" is null."); + } + this.minCompensation = setterArg; + } + + private @NonNull Long maxCompensation; + + public @NonNull Long getMaxCompensation() { + return maxCompensation; + } + + public void setMaxCompensation(@NonNull Long setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"maxCompensation\" is null."); + } + this.maxCompensation = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + ExposureCompensationRange() {} + + public static final class Builder { + + private @Nullable Long minCompensation; + + public @NonNull Builder setMinCompensation(@NonNull Long setterArg) { + this.minCompensation = setterArg; + return this; + } + + private @Nullable Long maxCompensation; + + public @NonNull Builder setMaxCompensation(@NonNull Long setterArg) { + this.maxCompensation = setterArg; + return this; + } + + public @NonNull ExposureCompensationRange build() { + ExposureCompensationRange pigeonReturn = new ExposureCompensationRange(); + pigeonReturn.setMinCompensation(minCompensation); + pigeonReturn.setMaxCompensation(maxCompensation); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList(2); + toListResult.add(minCompensation); + toListResult.add(maxCompensation); + return toListResult; + } + + static @NonNull ExposureCompensationRange fromList(@NonNull ArrayList list) { + ExposureCompensationRange pigeonResult = new ExposureCompensationRange(); + Object minCompensation = list.get(0); + pigeonResult.setMinCompensation((minCompensation == null) ? null : ((minCompensation instanceof Integer) ? (Integer) minCompensation : (Long) minCompensation)); + Object maxCompensation = list.get(1); + pigeonResult.setMaxCompensation((maxCompensation == null) ? null : ((maxCompensation instanceof Integer) ? (Integer) maxCompensation : (Long) maxCompensation)); return pigeonResult; } } @@ -301,7 +363,7 @@ public interface InstanceManagerHostApi { /** * Clear the native `InstanceManager`. * - *

This is typically only used after a hot restart. + * This is typically only used after a hot restart. */ void clear(); @@ -309,12 +371,8 @@ public interface InstanceManagerHostApi { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /** - * Sets up an instance of `InstanceManagerHostApi` to handle messages through the - * `binaryMessenger`. - */ - static void setup( - @NonNull BinaryMessenger binaryMessenger, @Nullable InstanceManagerHostApi api) { + /**Sets up an instance of `InstanceManagerHostApi` to handle messages through the `binaryMessenger`. */ + static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable InstanceManagerHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -326,7 +384,8 @@ static void setup( try { api.clear(); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -347,9 +406,7 @@ public interface JavaObjectHostApi { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /** - * 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(@NonNull BinaryMessenger binaryMessenger, @Nullable JavaObjectHostApi api) { { BasicMessageChannel channel = @@ -364,7 +421,8 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable JavaObject try { api.dispose((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -384,7 +442,7 @@ public JavaObjectFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -393,7 +451,6 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - public void dispose(@NonNull Long identifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -406,29 +463,28 @@ public void dispose(@NonNull Long identifierArg, @NonNull Reply callback) /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface CameraInfoHostApi { - @NonNull + @NonNull Long getSensorRotationDegrees(@NonNull Long identifier); - @NonNull + @NonNull + Long getLiveCameraState(@NonNull Long identifier); + + @NonNull Long getExposureState(@NonNull Long identifier); - @NonNull + @NonNull Long getZoomState(@NonNull Long identifier); /** The codec used by CameraInfoHostApi. */ static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /** - * 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(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraInfoHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -436,11 +492,10 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraInfo ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - Long output = - api.getSensorRotationDegrees( - (identifierArg == null) ? null : identifierArg.longValue()); + Long output = api.getSensorRotationDegrees((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -453,9 +508,7 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraInfo { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.CameraInfoHostApi.getExposureState", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.CameraInfoHostApi.getLiveCameraState", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -463,11 +516,34 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraInfo ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - Long output = - api.getExposureState( - (identifierArg == null) ? null : identifierArg.longValue()); + Long output = api.getLiveCameraState((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { + ArrayList wrappedError = wrapError(exception); + wrapped = wrappedError; + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.CameraInfoHostApi.getExposureState", getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number identifierArg = (Number) args.get(0); + try { + Long output = api.getExposureState((identifierArg == null) ? null : identifierArg.longValue()); + wrapped.add(0, output); + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -488,10 +564,10 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraInfo ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - Long output = - api.getZoomState((identifierArg == null) ? null : identifierArg.longValue()); + Long output = api.getZoomState((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -511,7 +587,7 @@ public CameraInfoFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -520,7 +596,6 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - public void create(@NonNull Long identifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -535,19 +610,15 @@ public interface CameraSelectorHostApi { void create(@NonNull Long identifier, @Nullable Long lensFacing); - @NonNull + @NonNull List filter(@NonNull Long identifier, @NonNull List cameraInfoIds); /** The codec used by CameraSelectorHostApi. */ static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /** - * Sets up an instance of `CameraSelectorHostApi` to handle messages through the - * `binaryMessenger`. - */ - static void setup( - @NonNull BinaryMessenger binaryMessenger, @Nullable CameraSelectorHostApi api) { + /**Sets up an instance of `CameraSelectorHostApi` to handle messages through the `binaryMessenger`. */ + static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraSelectorHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -560,11 +631,10 @@ static void setup( Number identifierArg = (Number) args.get(0); Number lensFacingArg = (Number) args.get(1); try { - api.create( - (identifierArg == null) ? null : identifierArg.longValue(), - (lensFacingArg == null) ? null : lensFacingArg.longValue()); + api.create((identifierArg == null) ? null : identifierArg.longValue(), (lensFacingArg == null) ? null : lensFacingArg.longValue()); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -586,12 +656,10 @@ static void setup( Number identifierArg = (Number) args.get(0); List cameraInfoIdsArg = (List) args.get(1); try { - List output = - api.filter( - (identifierArg == null) ? null : identifierArg.longValue(), - cameraInfoIdsArg); + List output = api.filter((identifierArg == null) ? null : identifierArg.longValue(), cameraInfoIdsArg); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -611,7 +679,7 @@ public CameraSelectorFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -620,9 +688,7 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - - public void create( - @NonNull Long identifierArg, @Nullable Long lensFacingArg, @NonNull Reply callback) { + public void create(@NonNull Long identifierArg, @Nullable Long lensFacingArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.CameraSelectorFlutterApi.create", getCodec()); @@ -636,16 +702,13 @@ public interface ProcessCameraProviderHostApi { void getInstance(@NonNull Result result); - @NonNull + @NonNull List getAvailableCameraInfos(@NonNull Long identifier); - @NonNull - Long bindToLifecycle( - @NonNull Long identifier, - @NonNull Long cameraSelectorIdentifier, - @NonNull List useCaseIds); + @NonNull + Long bindToLifecycle(@NonNull Long identifier, @NonNull Long cameraSelectorIdentifier, @NonNull List useCaseIds); - @NonNull + @NonNull Boolean isBound(@NonNull Long identifier, @NonNull Long useCaseIdentifier); void unbind(@NonNull Long identifier, @NonNull List useCaseIds); @@ -656,18 +719,12 @@ Long bindToLifecycle( static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /** - * Sets up an instance of `ProcessCameraProviderHostApi` to handle messages through the - * `binaryMessenger`. - */ - static void setup( - @NonNull BinaryMessenger binaryMessenger, @Nullable ProcessCameraProviderHostApi api) { + /**Sets up an instance of `ProcessCameraProviderHostApi` to handle messages through the `binaryMessenger`. */ + static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ProcessCameraProviderHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -694,9 +751,7 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -704,11 +759,10 @@ public void error(Throwable error) { ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - List output = - api.getAvailableCameraInfos( - (identifierArg == null) ? null : identifierArg.longValue()); + List output = api.getAvailableCameraInfos((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -721,9 +775,7 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.ProcessCameraProviderHostApi.bindToLifecycle", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.bindToLifecycle", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -733,15 +785,10 @@ public void error(Throwable error) { Number cameraSelectorIdentifierArg = (Number) args.get(1); List useCaseIdsArg = (List) args.get(2); try { - Long output = - api.bindToLifecycle( - (identifierArg == null) ? null : identifierArg.longValue(), - (cameraSelectorIdentifierArg == null) - ? null - : cameraSelectorIdentifierArg.longValue(), - useCaseIdsArg); + Long output = api.bindToLifecycle((identifierArg == null) ? null : identifierArg.longValue(), (cameraSelectorIdentifierArg == null) ? null : cameraSelectorIdentifierArg.longValue(), useCaseIdsArg); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -754,9 +801,7 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.ProcessCameraProviderHostApi.isBound", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.isBound", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -765,12 +810,10 @@ public void error(Throwable error) { Number identifierArg = (Number) args.get(0); Number useCaseIdentifierArg = (Number) args.get(1); try { - Boolean output = - api.isBound( - (identifierArg == null) ? null : identifierArg.longValue(), - (useCaseIdentifierArg == null) ? null : useCaseIdentifierArg.longValue()); + Boolean output = api.isBound((identifierArg == null) ? null : identifierArg.longValue(), (useCaseIdentifierArg == null) ? null : useCaseIdentifierArg.longValue()); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -783,9 +826,7 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.ProcessCameraProviderHostApi.unbind", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.unbind", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -794,10 +835,10 @@ public void error(Throwable error) { Number identifierArg = (Number) args.get(0); List useCaseIdsArg = (List) args.get(1); try { - api.unbind( - (identifierArg == null) ? null : identifierArg.longValue(), useCaseIdsArg); + api.unbind((identifierArg == null) ? null : identifierArg.longValue(), useCaseIdsArg); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -810,9 +851,7 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.ProcessCameraProviderHostApi.unbindAll", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.unbindAll", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -822,7 +861,8 @@ public void error(Throwable error) { try { api.unbindAll((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -842,7 +882,7 @@ public ProcessCameraProviderFlutterApi(@NonNull BinaryMessenger argBinaryMesseng this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -851,13 +891,10 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - public void create(@NonNull Long identifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create", getCodec()); channel.send( new ArrayList(Collections.singletonList(identifierArg)), channelReply -> callback.reply(null)); @@ -866,14 +903,14 @@ public void create(@NonNull Long identifierArg, @NonNull Reply callback) { /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface CameraHostApi { - @NonNull + @NonNull Long getCameraInfo(@NonNull Long identifier); /** The codec used by CameraHostApi. */ static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /** Sets up an instance of `CameraHostApi` to handle messages through the `binaryMessenger`. */ + /**Sets up an instance of `CameraHostApi` to handle messages through the `binaryMessenger`. */ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraHostApi api) { { BasicMessageChannel channel = @@ -886,10 +923,10 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraHost ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - Long output = - api.getCameraInfo((identifierArg == null) ? null : identifierArg.longValue()); + Long output = api.getCameraInfo((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -909,7 +946,7 @@ public CameraFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -918,7 +955,6 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - public void create(@NonNull Long identifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -958,11 +994,9 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface SystemServicesHostApi { - void requestCameraPermissions( - @NonNull Boolean enableAudio, @NonNull Result result); + void requestCameraPermissions(@NonNull Boolean enableAudio, @NonNull Result result); - void startListeningForDeviceOrientationChange( - @NonNull Boolean isFrontFacing, @NonNull Long sensorOrientation); + void startListeningForDeviceOrientationChange(@NonNull Boolean isFrontFacing, @NonNull Long sensorOrientation); void stopListeningForDeviceOrientationChange(); @@ -970,18 +1004,12 @@ void startListeningForDeviceOrientationChange( static @NonNull MessageCodec getCodec() { return SystemServicesHostApiCodec.INSTANCE; } - /** - * Sets up an instance of `SystemServicesHostApi` to handle messages through the - * `binaryMessenger`. - */ - static void setup( - @NonNull BinaryMessenger binaryMessenger, @Nullable SystemServicesHostApi api) { + /**Sets up an instance of `SystemServicesHostApi` to handle messages through the `binaryMessenger`. */ + static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable SystemServicesHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.SystemServicesHostApi.requestCameraPermissions", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.SystemServicesHostApi.requestCameraPermissions", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1010,9 +1038,7 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.SystemServicesHostApi.startListeningForDeviceOrientationChange", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.SystemServicesHostApi.startListeningForDeviceOrientationChange", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1021,11 +1047,10 @@ public void error(Throwable error) { Boolean isFrontFacingArg = (Boolean) args.get(0); Number sensorOrientationArg = (Number) args.get(1); try { - api.startListeningForDeviceOrientationChange( - isFrontFacingArg, - (sensorOrientationArg == null) ? null : sensorOrientationArg.longValue()); + api.startListeningForDeviceOrientationChange(isFrontFacingArg, (sensorOrientationArg == null) ? null : sensorOrientationArg.longValue()); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1038,9 +1063,7 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.SystemServicesHostApi.stopListeningForDeviceOrientationChange", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.SystemServicesHostApi.stopListeningForDeviceOrientationChange", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1048,7 +1071,8 @@ public void error(Throwable error) { try { api.stopListeningForDeviceOrientationChange(); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1068,7 +1092,7 @@ public SystemServicesFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -1077,25 +1101,18 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - - public void onDeviceOrientationChanged( - @NonNull String orientationArg, @NonNull Reply callback) { + public void onDeviceOrientationChanged(@NonNull String orientationArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.SystemServicesFlutterApi.onDeviceOrientationChanged", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.SystemServicesFlutterApi.onDeviceOrientationChanged", getCodec()); channel.send( new ArrayList(Collections.singletonList(orientationArg)), channelReply -> callback.reply(null)); } - public void onCameraError(@NonNull String errorDescriptionArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.SystemServicesFlutterApi.onCameraError", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.SystemServicesFlutterApi.onCameraError", getCodec()); channel.send( new ArrayList(Collections.singletonList(errorDescriptionArg)), channelReply -> callback.reply(null)); @@ -1136,24 +1153,21 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface PreviewHostApi { - void create( - @NonNull Long identifier, - @Nullable Long rotation, - @Nullable ResolutionInfo targetResolution); + void create(@NonNull Long identifier, @Nullable Long rotation, @Nullable ResolutionInfo targetResolution); - @NonNull + @NonNull Long setSurfaceProvider(@NonNull Long identifier); void releaseFlutterSurfaceTexture(); - @NonNull + @NonNull ResolutionInfo getResolutionInfo(@NonNull Long identifier); /** The codec used by PreviewHostApi. */ static @NonNull MessageCodec getCodec() { return PreviewHostApiCodec.INSTANCE; } - /** Sets up an instance of `PreviewHostApi` to handle messages through the `binaryMessenger`. */ + /**Sets up an instance of `PreviewHostApi` to handle messages through the `binaryMessenger`. */ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHostApi api) { { BasicMessageChannel channel = @@ -1168,12 +1182,10 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHos Number rotationArg = (Number) args.get(1); ResolutionInfo targetResolutionArg = (ResolutionInfo) args.get(2); try { - api.create( - (identifierArg == null) ? null : identifierArg.longValue(), - (rotationArg == null) ? null : rotationArg.longValue(), - targetResolutionArg); + api.create((identifierArg == null) ? null : identifierArg.longValue(), (rotationArg == null) ? null : rotationArg.longValue(), targetResolutionArg); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1186,9 +1198,7 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHos { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.PreviewHostApi.setSurfaceProvider", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.PreviewHostApi.setSurfaceProvider", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1196,11 +1206,10 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHos ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - Long output = - api.setSurfaceProvider( - (identifierArg == null) ? null : identifierArg.longValue()); + Long output = api.setSurfaceProvider((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1213,9 +1222,7 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHos { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.PreviewHostApi.releaseFlutterSurfaceTexture", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.PreviewHostApi.releaseFlutterSurfaceTexture", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1223,7 +1230,8 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHos try { api.releaseFlutterSurfaceTexture(); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1244,11 +1252,10 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHos ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - ResolutionInfo output = - api.getResolutionInfo( - (identifierArg == null) ? null : identifierArg.longValue()); + ResolutionInfo output = api.getResolutionInfo((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1290,10 +1297,7 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface ImageCaptureHostApi { - void create( - @NonNull Long identifier, - @Nullable Long flashMode, - @Nullable ResolutionInfo targetResolution); + void create(@NonNull Long identifier, @Nullable Long flashMode, @Nullable ResolutionInfo targetResolution); void setFlashMode(@NonNull Long identifier, @NonNull Long flashMode); @@ -1303,10 +1307,7 @@ void create( static @NonNull MessageCodec getCodec() { return ImageCaptureHostApiCodec.INSTANCE; } - /** - * Sets up an instance of `ImageCaptureHostApi` to handle messages through the - * `binaryMessenger`. - */ + /**Sets up an instance of `ImageCaptureHostApi` to handle messages through the `binaryMessenger`. */ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageCaptureHostApi api) { { BasicMessageChannel channel = @@ -1321,12 +1322,10 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageCaptu Number flashModeArg = (Number) args.get(1); ResolutionInfo targetResolutionArg = (ResolutionInfo) args.get(2); try { - api.create( - (identifierArg == null) ? null : identifierArg.longValue(), - (flashModeArg == null) ? null : flashModeArg.longValue(), - targetResolutionArg); + api.create((identifierArg == null) ? null : identifierArg.longValue(), (flashModeArg == null) ? null : flashModeArg.longValue(), targetResolutionArg); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1348,11 +1347,10 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageCaptu Number identifierArg = (Number) args.get(0); Number flashModeArg = (Number) args.get(1); try { - api.setFlashMode( - (identifierArg == null) ? null : identifierArg.longValue(), - (flashModeArg == null) ? null : flashModeArg.longValue()); + api.setFlashMode((identifierArg == null) ? null : identifierArg.longValue(), (flashModeArg == null) ? null : flashModeArg.longValue()); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1385,8 +1383,7 @@ public void error(Throwable error) { } }; - api.takePicture( - (identifierArg == null) ? null : identifierArg.longValue(), resultCallback); + api.takePicture((identifierArg == null) ? null : identifierArg.longValue(), resultCallback); }); } else { channel.setMessageHandler(null); @@ -1429,7 +1426,7 @@ public ExposureStateFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -1438,19 +1435,12 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return ExposureStateFlutterApiCodec.INSTANCE; } - - public void create( - @NonNull Long identifierArg, - @NonNull ExposureCompensationRange exposureCompensationRangeArg, - @NonNull Double exposureCompensationStepArg, - @NonNull Reply callback) { + public void create(@NonNull Long identifierArg, @NonNull ExposureCompensationRange exposureCompensationRangeArg, @NonNull Double exposureCompensationStepArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.ExposureStateFlutterApi.create", getCodec()); channel.send( - new ArrayList( - Arrays.asList( - identifierArg, exposureCompensationRangeArg, exposureCompensationStepArg)), + new ArrayList(Arrays.asList(identifierArg, exposureCompensationRangeArg, exposureCompensationStepArg)), channelReply -> callback.reply(null)); } } @@ -1462,7 +1452,7 @@ public ZoomStateFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -1471,12 +1461,86 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } + public void create(@NonNull Long identifierArg, @NonNull Double minZoomRatioArg, @NonNull Double maxZoomRatioArg, @NonNull Reply callback) { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.ZoomStateFlutterApi.create", getCodec()); + channel.send( + new ArrayList(Arrays.asList(identifierArg, minZoomRatioArg, maxZoomRatioArg)), + channelReply -> callback.reply(null)); + } + } + + private static class ExposureStateFlutterApiCodec extends StandardMessageCodec { + public static final ExposureStateFlutterApiCodec INSTANCE = new ExposureStateFlutterApiCodec(); + + private ExposureStateFlutterApiCodec() {} + + @Override + protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { + switch (type) { + case (byte) 128: + return ExposureCompensationRange.fromList((ArrayList) readValue(buffer)); + default: + return super.readValueOfType(type, buffer); + } + } + + @Override + protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { + if (value instanceof ExposureCompensationRange) { + stream.write(128); + writeValue(stream, ((ExposureCompensationRange) value).toList()); + } else { + super.writeValue(stream, value); + } + } + } + + /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ + public static class ExposureStateFlutterApi { + private final @NonNull BinaryMessenger binaryMessenger; - public void create( - @NonNull Long identifierArg, - @NonNull Double minZoomRatioArg, - @NonNull Double maxZoomRatioArg, - @NonNull Reply callback) { + public ExposureStateFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { + this.binaryMessenger = argBinaryMessenger; + } + + /** Public interface for sending reply. */ + @SuppressWarnings("UnknownNullness") + public interface Reply { + void reply(T reply); + } + /** The codec used by ExposureStateFlutterApi. */ + static @NonNull MessageCodec getCodec() { + return ExposureStateFlutterApiCodec.INSTANCE; + } + public void create(@NonNull Long identifierArg, @NonNull ExposureCompensationRange exposureCompensationRangeArg, @NonNull Double exposureCompensationStepArg, @NonNull Reply callback) { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.ExposureStateFlutterApi.create", getCodec()); + channel.send( + new ArrayList(Arrays.asList(identifierArg, exposureCompensationRangeArg, exposureCompensationStepArg)), + channelReply -> callback.reply(null)); + } + } + /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ + public static class ZoomStateFlutterApi { + private final @NonNull BinaryMessenger binaryMessenger; + + public ZoomStateFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { + this.binaryMessenger = argBinaryMessenger; + } + + /** Public interface for sending reply. */ + @SuppressWarnings("UnknownNullness") + public interface Reply { + void reply(T reply); + } + /** The codec used by ZoomStateFlutterApi. */ + static @NonNull MessageCodec getCodec() { + return new StandardMessageCodec(); + } + public void create(@NonNull Long identifierArg, @NonNull Double minZoomRatioArg, @NonNull Double maxZoomRatioArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.ZoomStateFlutterApi.create", getCodec()); @@ -1525,12 +1589,8 @@ public interface ImageAnalysisHostApi { static @NonNull MessageCodec getCodec() { return ImageAnalysisHostApiCodec.INSTANCE; } - /** - * Sets up an instance of `ImageAnalysisHostApi` to handle messages through the - * `binaryMessenger`. - */ - static void setup( - @NonNull BinaryMessenger binaryMessenger, @Nullable ImageAnalysisHostApi api) { + /**Sets up an instance of `ImageAnalysisHostApi` to handle messages through the `binaryMessenger`. */ + static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageAnalysisHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -1543,11 +1603,10 @@ static void setup( Number identifierArg = (Number) args.get(0); ResolutionInfo targetResolutionIdentifierArg = (ResolutionInfo) args.get(1); try { - api.create( - (identifierArg == null) ? null : identifierArg.longValue(), - targetResolutionIdentifierArg); + api.create((identifierArg == null) ? null : identifierArg.longValue(), targetResolutionIdentifierArg); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1569,11 +1628,10 @@ static void setup( Number identifierArg = (Number) args.get(0); Number analyzerIdentifierArg = (Number) args.get(1); try { - api.setAnalyzer( - (identifierArg == null) ? null : identifierArg.longValue(), - (analyzerIdentifierArg == null) ? null : analyzerIdentifierArg.longValue()); + api.setAnalyzer((identifierArg == null) ? null : identifierArg.longValue(), (analyzerIdentifierArg == null) ? null : analyzerIdentifierArg.longValue()); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1586,9 +1644,7 @@ static void setup( { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.ImageAnalysisHostApi.clearAnalyzer", - getCodec()); + binaryMessenger, "dev.flutter.pigeon.ImageAnalysisHostApi.clearAnalyzer", getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1598,7 +1654,8 @@ static void setup( try { api.clearAnalyzer((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1619,9 +1676,7 @@ public interface AnalyzerHostApi { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /** - * Sets up an instance of `AnalyzerHostApi` to handle messages through the `binaryMessenger`. - */ + /**Sets up an instance of `AnalyzerHostApi` to handle messages through the `binaryMessenger`. */ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable AnalyzerHostApi api) { { BasicMessageChannel channel = @@ -1636,7 +1691,8 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable AnalyzerHo try { api.create((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1656,7 +1712,7 @@ public AnalyzerFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -1665,7 +1721,6 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - public void create(@NonNull Long identifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -1674,11 +1729,7 @@ public void create(@NonNull Long identifierArg, @NonNull Reply callback) { new ArrayList(Collections.singletonList(identifierArg)), channelReply -> callback.reply(null)); } - - public void analyze( - @NonNull Long identifierArg, - @NonNull Long imageProxyIdentifierArg, - @NonNull Reply callback) { + public void analyze(@NonNull Long identifierArg, @NonNull Long imageProxyIdentifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.AnalyzerFlutterApi.analyze", getCodec()); @@ -1690,7 +1741,7 @@ public void analyze( /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface ImageProxyHostApi { - @NonNull + @NonNull List getPlanes(@NonNull Long identifier); void close(@NonNull Long identifier); @@ -1699,9 +1750,7 @@ public interface ImageProxyHostApi { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /** - * Sets up an instance of `ImageProxyHostApi` to handle messages through the `binaryMessenger`. - */ + /**Sets up an instance of `ImageProxyHostApi` to handle messages through the `binaryMessenger`. */ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageProxyHostApi api) { { BasicMessageChannel channel = @@ -1714,10 +1763,10 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageProxy ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - List output = - api.getPlanes((identifierArg == null) ? null : identifierArg.longValue()); + List output = api.getPlanes((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1740,7 +1789,8 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageProxy try { api.close((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1760,7 +1810,7 @@ public ImageProxyFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -1769,13 +1819,7 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - - public void create( - @NonNull Long identifierArg, - @NonNull Long formatArg, - @NonNull Long heightArg, - @NonNull Long widthArg, - @NonNull Reply callback) { + public void create(@NonNull Long identifierArg, @NonNull Long formatArg, @NonNull Long heightArg, @NonNull Long widthArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.ImageProxyFlutterApi.create", getCodec()); @@ -1792,7 +1836,7 @@ public PlaneProxyFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -1801,19 +1845,12 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - - public void create( - @NonNull Long identifierArg, - @NonNull byte[] bufferArg, - @NonNull Long pixelStrideArg, - @NonNull Long rowStrideArg, - @NonNull Reply callback) { + public void create(@NonNull Long identifierArg, @NonNull byte[] bufferArg, @NonNull Long pixelStrideArg, @NonNull Long rowStrideArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.PlaneProxyFlutterApi.create", getCodec()); channel.send( - new ArrayList( - Arrays.asList(identifierArg, bufferArg, pixelStrideArg, rowStrideArg)), + new ArrayList(Arrays.asList(identifierArg, bufferArg, pixelStrideArg, rowStrideArg)), channelReply -> callback.reply(null)); } } diff --git a/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/CameraInfoTest.java b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/CameraInfoTest.java index 5cfd06935b85..379cf3f3b05c 100644 --- a/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/CameraInfoTest.java +++ b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/CameraInfoTest.java @@ -13,6 +13,7 @@ import static org.mockito.Mockito.when; import androidx.camera.core.CameraInfo; +import androidx.camera.core.CameraState; import androidx.camera.core.ExposureState; import androidx.camera.core.ZoomState; import androidx.lifecycle.LiveData; diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart index 174a373e3b9b..f0eac80d9eed 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart @@ -45,6 +45,10 @@ class AndroidCameraCameraX extends CameraPlatform { @visibleForTesting CameraInfo? cameraInfo; + /// The [LiveData] of the [CameraState] that represents the state of the + /// [camera] instance. + LiveData? liveCameraState; + /// The [Preview] instance that can be configured to present a live camera preview. @visibleForTesting Preview? preview; @@ -196,6 +200,7 @@ class AndroidCameraCameraX extends CameraPlatform { // instance as bound but not paused. camera = await processCameraProvider! .bindToLifecycle(cameraSelector!, [preview!, imageCapture!]); + await _updateLiveCameraState(flutterSurfaceTextureId); cameraInfo = await camera!.getCameraInfo(); _previewIsPaused = false; @@ -325,6 +330,55 @@ class AndroidCameraCameraX extends CameraPlatform { return exposureState.minZoomRatio; } + /// Gets the minimum supported exposure offset for the selected camera in EV units. + /// + /// [cameraId] not used. + @override + Future getMinExposureOffset(int cameraId) async { + final ExposureState exposureState = await cameraInfo!.getExposureState(); + return exposureState.exposureCompensationRange.minCompensation * + exposureState.exposureCompensationStep; + } + + /// Gets the maximum supported exposure offset for the selected camera in EV units. + /// + /// [cameraId] not used. + @override + Future getMaxExposureOffset(int cameraId) async { + final ExposureState exposureState = await cameraInfo!.getExposureState(); + return exposureState.exposureCompensationRange.maxCompensation * + exposureState.exposureCompensationStep; + } + + /// Gets the supported step size for exposure offset for the selected camera in EV units. + /// + /// Returns 0 when exposure compensation is not supported. + /// + /// [cameraId] not used. + @override + Future getExposureOffsetStepSize(int cameraId) async { + final ExposureState exposureState = await cameraInfo!.getExposureState(); + return exposureState.exposureCompensationStep; + } + + /// Gets the maximum supported zoom level for the selected camera. + /// + /// [cameraId] not used. + @override + Future getMaxZoomLevel(int cameraId) async { + final ZoomState exposureState = await cameraInfo!.getZoomState(); + return exposureState.maxZoomRatio; + } + + /// Gets the minimum supported zoom level for the selected camera. + /// + /// [cameraId] not used. + @override + Future getMinZoomLevel(int cameraId) async { + final ZoomState exposureState = await cameraInfo!.getZoomState(); + return exposureState.minZoomRatio; + } + /// The ui orientation changed. @override Stream onDeviceOrientationChanged() { @@ -413,6 +467,7 @@ class AndroidCameraCameraX extends CameraPlatform { camera = await processCameraProvider! .bindToLifecycle(cameraSelector!, [preview!]); + await _updateLiveCameraState(cameraId); cameraInfo = await camera!.getCameraInfo(); } 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 c5692ae105f2..f92ef8349267 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 @@ -19,33 +19,46 @@ import 'zoom_state.dart'; class AndroidCameraXCameraFlutterApis { /// Creates a [AndroidCameraXCameraFlutterApis]. AndroidCameraXCameraFlutterApis({ - JavaObjectFlutterApiImpl? javaObjectFlutterApi, - CameraFlutterApiImpl? cameraFlutterApi, - CameraInfoFlutterApiImpl? cameraInfoFlutterApi, - CameraSelectorFlutterApiImpl? cameraSelectorFlutterApi, - ProcessCameraProviderFlutterApiImpl? processCameraProviderFlutterApi, - SystemServicesFlutterApiImpl? systemServicesFlutterApi, + JavaObjectFlutterApiImpl? javaObjectFlutterApiImpl, + CameraFlutterApiImpl? cameraFlutterApiImpl, + CameraInfoFlutterApiImpl? cameraInfoFlutterApiImpl, + CameraSelectorFlutterApiImpl? cameraSelectorFlutterApiImpl, + ProcessCameraProviderFlutterApiImpl? processCameraProviderFlutterApiImpl, + SystemServicesFlutterApiImpl? systemServicesFlutterApiImpl, + CameraStateErrorFlutterApiImpl? cameraStateErrorFlutterApiImpl, + CameraStateFlutterApiImpl? cameraStateFlutterApiImpl, ExposureStateFlutterApiImpl? exposureStateFlutterApiImpl, ZoomStateFlutterApiImpl? zoomStateFlutterApiImpl, - AnalyzerFlutterApiImpl? analyzerFlutterApiImpl, + LiveDataFlutterApiImpl? liveDataFlutterApiImpl, + ObserverFlutterApiImpl? observerFlutterApiImpl, ImageProxyFlutterApiImpl? imageProxyFlutterApiImpl, PlaneProxyFlutterApiImpl? planeProxyFlutterApiImpl, + AnalyzerFlutterApiImpl? analyzerFlutterApiImpl, }) { - this.javaObjectFlutterApi = - javaObjectFlutterApi ?? JavaObjectFlutterApiImpl(); - this.cameraInfoFlutterApi = - cameraInfoFlutterApi ?? CameraInfoFlutterApiImpl(); - this.cameraSelectorFlutterApi = - cameraSelectorFlutterApi ?? CameraSelectorFlutterApiImpl(); - this.processCameraProviderFlutterApi = processCameraProviderFlutterApi ?? - ProcessCameraProviderFlutterApiImpl(); - this.cameraFlutterApi = cameraFlutterApi ?? CameraFlutterApiImpl(); - this.systemServicesFlutterApi = - systemServicesFlutterApi ?? SystemServicesFlutterApiImpl(); + this.javaObjectFlutterApiImpl = + javaObjectFlutterApiImpl ?? JavaObjectFlutterApiImpl(); + this.cameraInfoFlutterApiImpl = + cameraInfoFlutterApiImpl ?? CameraInfoFlutterApiImpl(); + this.cameraSelectorFlutterApiImpl = + cameraSelectorFlutterApiImpl ?? CameraSelectorFlutterApiImpl(); + this.processCameraProviderFlutterApiImpl = + processCameraProviderFlutterApiImpl ?? + ProcessCameraProviderFlutterApiImpl(); + this.cameraFlutterApiImpl = cameraFlutterApiImpl ?? CameraFlutterApiImpl(); + this.systemServicesFlutterApiImpl = + systemServicesFlutterApiImpl ?? SystemServicesFlutterApiImpl(); + this.cameraStateErrorFlutterApiImpl = + cameraStateErrorFlutterApiImpl ?? CameraStateErrorFlutterApiImpl(); + this.cameraStateFlutterApiImpl = + cameraStateFlutterApiImpl ?? CameraStateFlutterApiImpl(); this.exposureStateFlutterApiImpl = exposureStateFlutterApiImpl ?? ExposureStateFlutterApiImpl(); this.zoomStateFlutterApiImpl = zoomStateFlutterApiImpl ?? ZoomStateFlutterApiImpl(); + this.liveDataFlutterApiImpl = + liveDataFlutterApiImpl ?? LiveDataFlutterApiImpl(); + this.observerFlutterApiImpl = + observerFlutterApiImpl ?? ObserverFlutterApiImpl(); this.analyzerFlutterApiImpl = analyzerFlutterApiImpl ?? AnalyzerFlutterApiImpl(); this.imageProxyFlutterApiImpl = @@ -87,6 +100,12 @@ class AndroidCameraXCameraFlutterApis { /// Flutter Api for [ZoomState]. late final ZoomStateFlutterApiImpl zoomStateFlutterApiImpl; + /// Flutter Api for [ExposureState]. + late final ExposureStateFlutterApiImpl exposureStateFlutterApiImpl; + + /// Flutter Api for [ZoomState]. + late final ZoomStateFlutterApiImpl zoomStateFlutterApiImpl; + /// Flutter Api implementation for [Analyzer]. late final AnalyzerFlutterApiImpl analyzerFlutterApiImpl; @@ -99,12 +118,15 @@ class AndroidCameraXCameraFlutterApis { /// 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); - CameraFlutterApi.setup(cameraFlutterApi); - SystemServicesFlutterApi.setup(systemServicesFlutterApi); + JavaObjectFlutterApi.setup(javaObjectFlutterApiImpl); + CameraInfoFlutterApi.setup(cameraInfoFlutterApiImpl); + CameraSelectorFlutterApi.setup(cameraSelectorFlutterApiImpl); + ProcessCameraProviderFlutterApi.setup( + processCameraProviderFlutterApiImpl); + CameraFlutterApi.setup(cameraFlutterApiImpl); + SystemServicesFlutterApi.setup(systemServicesFlutterApiImpl); + CameraStateErrorFlutterApi.setup(cameraStateErrorFlutterApiImpl); + CameraStateFlutterApi.setup(cameraStateFlutterApiImpl); ExposureStateFlutterApi.setup(exposureStateFlutterApiImpl); ZoomStateFlutterApi.setup(zoomStateFlutterApiImpl); AnalyzerFlutterApi.setup(analyzerFlutterApiImpl); 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 f2fdc1fdc879..07e6816fc70a 100644 --- a/packages/camera/camera_android_camerax/lib/src/camera_info.dart +++ b/packages/camera/camera_android_camerax/lib/src/camera_info.dart @@ -9,6 +9,7 @@ import 'camerax_library.g.dart'; import 'exposure_state.dart'; import 'instance_manager.dart'; import 'java_object.dart'; +import 'live_data.dart'; import 'zoom_state.dart'; /// Represents the metadata of a camera. @@ -32,6 +33,10 @@ class CameraInfo extends JavaObject { Future getSensorRotationDegrees() => _api.getSensorRotationDegreesFromInstance(this); + /// Starts listening for the camera closing. + Future> getLiveCameraState() => + _api.getLiveCameraStateFromInstance(this); + /// Gets the exposure state of the camera. Future getExposureState() => _api.getExposureStateFromInstance(this); @@ -76,6 +81,23 @@ class _CameraInfoHostApiImpl extends CameraInfoHostApi { return instanceManager .getInstanceWithWeakReference(zoomStateIdentifier)!; } + + /// Gets the [ExposureState] of the specified [CameraInfo] instance. + Future getExposureStateFromInstance( + CameraInfo instance) async { + final int? identifier = instanceManager.getIdentifier(instance); + final int exposureStateIdentifier = await getExposureState(identifier!); + return instanceManager + .getInstanceWithWeakReference(exposureStateIdentifier)!; + } + + /// Gets the [ZoomState] of the specified [CameraInfo] instance. + Future getZoomStateFromInstance(CameraInfo instance) async { + final int? identifier = instanceManager.getIdentifier(instance); + final int zoomStateIdentifier = await getZoomState(identifier!); + return instanceManager + .getInstanceWithWeakReference(zoomStateIdentifier)!; + } } /// Flutter API implementation of [CameraInfo]. diff --git a/packages/camera/camera_android_camerax/lib/src/camerax_library.g.dart b/packages/camera/camera_android_camerax/lib/src/camerax_library.g.dart index f2d2e17152fb..b5afcaa735a9 100644 --- a/packages/camera/camera_android_camerax/lib/src/camerax_library.g.dart +++ b/packages/camera/camera_android_camerax/lib/src/camerax_library.g.dart @@ -89,6 +89,32 @@ class ExposureCompensationRange { } } +class ExposureCompensationRange { + ExposureCompensationRange({ + required this.minCompensation, + required this.maxCompensation, + }); + + int minCompensation; + + int maxCompensation; + + Object encode() { + return [ + minCompensation, + maxCompensation, + ]; + } + + static ExposureCompensationRange decode(Object result) { + result as List; + return ExposureCompensationRange( + minCompensation: result[0]! as int, + maxCompensation: result[1]! as int, + ); + } +} + class InstanceManagerHostApi { /// Constructor for [InstanceManagerHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default @@ -106,7 +132,8 @@ class InstanceManagerHostApi { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.InstanceManagerHostApi.clear', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel.send(null) as List?; + final List? replyList = + await channel.send(null) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -162,8 +189,7 @@ abstract class JavaObjectFlutterApi { 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, @@ -173,7 +199,7 @@ abstract class JavaObjectFlutterApi { } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.JavaObjectFlutterApi.dispose was 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, @@ -223,6 +249,33 @@ class CameraInfoHostApi { } } + Future getLiveCameraState(int arg_identifier) async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.CameraInfoHostApi.getLiveCameraState', codec, + binaryMessenger: _binaryMessenger); + final List? replyList = + await channel.send([arg_identifier]) as List?; + if (replyList == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyList.length > 1) { + throw PlatformException( + code: replyList[0]! as String, + message: replyList[1] as String?, + details: replyList[2], + ); + } else if (replyList[0] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (replyList[0] as int?)!; + } + } + Future getExposureState(int arg_identifier) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.CameraInfoHostApi.getExposureState', codec, @@ -283,8 +336,7 @@ abstract class CameraInfoFlutterApi { 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, @@ -294,7 +346,7 @@ abstract class CameraInfoFlutterApi { } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.CameraInfoFlutterApi.create was 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, @@ -321,8 +373,8 @@ class CameraSelectorHostApi { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.CameraSelectorHostApi.create', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_identifier, arg_lensFacing]) as List?; + final List? replyList = + await channel.send([arg_identifier, arg_lensFacing]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -339,13 +391,12 @@ 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); - final List? replyList = await channel - .send([arg_identifier, arg_cameraInfoIds]) as List?; + final List? replyList = + await channel.send([arg_identifier, arg_cameraInfoIds]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -373,8 +424,7 @@ abstract class CameraSelectorFlutterApi { 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, @@ -384,7 +434,7 @@ abstract class CameraSelectorFlutterApi { } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.CameraSelectorFlutterApi.create was 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, @@ -412,7 +462,8 @@ class ProcessCameraProviderHostApi { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel.send(null) as List?; + final List? replyList = + await channel.send(null) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -436,8 +487,7 @@ class ProcessCameraProviderHostApi { Future> getAvailableCameraInfos(int arg_identifier) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', - codec, + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([arg_identifier]) as List?; @@ -462,17 +512,12 @@ class ProcessCameraProviderHostApi { } } - Future bindToLifecycle(int arg_identifier, - int arg_cameraSelectorIdentifier, List arg_useCaseIds) async { + Future bindToLifecycle(int arg_identifier, int arg_cameraSelectorIdentifier, List arg_useCaseIds) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ProcessCameraProviderHostApi.bindToLifecycle', - codec, + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.bindToLifecycle', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel.send([ - arg_identifier, - arg_cameraSelectorIdentifier, - arg_useCaseIds - ]) as List?; + final List? replyList = + await channel.send([arg_identifier, arg_cameraSelectorIdentifier, arg_useCaseIds]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -499,8 +544,7 @@ class ProcessCameraProviderHostApi { 'dev.flutter.pigeon.ProcessCameraProviderHostApi.isBound', codec, binaryMessenger: _binaryMessenger); final List? replyList = - await channel.send([arg_identifier, arg_useCaseIdentifier]) - as List?; + await channel.send([arg_identifier, arg_useCaseIdentifier]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -526,8 +570,8 @@ class ProcessCameraProviderHostApi { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ProcessCameraProviderHostApi.unbind', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_identifier, arg_useCaseIds]) as List?; + final List? replyList = + await channel.send([arg_identifier, arg_useCaseIds]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -572,8 +616,7 @@ abstract class ProcessCameraProviderFlutterApi { void create(int identifier); - static void setup(ProcessCameraProviderFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(ProcessCameraProviderFlutterApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create', codec, @@ -583,7 +626,7 @@ abstract class ProcessCameraProviderFlutterApi { } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create was null.'); + 'Argument for dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -649,7 +692,7 @@ abstract class CameraFlutterApi { } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.CameraFlutterApi.create was null.'); + 'Argument for dev.flutter.pigeon.CameraFlutterApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -677,7 +720,7 @@ class _SystemServicesHostApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return CameraPermissionsErrorData.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -695,11 +738,9 @@ class SystemServicesHostApi { static const MessageCodec codec = _SystemServicesHostApiCodec(); - Future requestCameraPermissions( - bool arg_enableAudio) async { + Future requestCameraPermissions(bool arg_enableAudio) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.SystemServicesHostApi.requestCameraPermissions', - codec, + 'dev.flutter.pigeon.SystemServicesHostApi.requestCameraPermissions', codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([arg_enableAudio]) as List?; @@ -719,15 +760,12 @@ class SystemServicesHostApi { } } - Future startListeningForDeviceOrientationChange( - bool arg_isFrontFacing, int arg_sensorOrientation) async { + Future startListeningForDeviceOrientationChange(bool arg_isFrontFacing, int arg_sensorOrientation) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.SystemServicesHostApi.startListeningForDeviceOrientationChange', - codec, + 'dev.flutter.pigeon.SystemServicesHostApi.startListeningForDeviceOrientationChange', codec, binaryMessenger: _binaryMessenger); final List? replyList = - await channel.send([arg_isFrontFacing, arg_sensorOrientation]) - as List?; + await channel.send([arg_isFrontFacing, arg_sensorOrientation]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -746,10 +784,10 @@ class SystemServicesHostApi { Future stopListeningForDeviceOrientationChange() async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.SystemServicesHostApi.stopListeningForDeviceOrientationChange', - codec, + 'dev.flutter.pigeon.SystemServicesHostApi.stopListeningForDeviceOrientationChange', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel.send(null) as List?; + final List? replyList = + await channel.send(null) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -774,19 +812,17 @@ abstract class SystemServicesFlutterApi { void onCameraError(String errorDescription); - static void setup(SystemServicesFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(SystemServicesFlutterApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.SystemServicesFlutterApi.onDeviceOrientationChanged', - codec, + 'dev.flutter.pigeon.SystemServicesFlutterApi.onDeviceOrientationChanged', codec, binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.SystemServicesFlutterApi.onDeviceOrientationChanged was null.'); + 'Argument for dev.flutter.pigeon.SystemServicesFlutterApi.onDeviceOrientationChanged was null.'); final List args = (message as List?)!; final String? arg_orientation = (args[0] as String?); assert(arg_orientation != null, @@ -805,7 +841,7 @@ abstract class SystemServicesFlutterApi { } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.SystemServicesFlutterApi.onCameraError was null.'); + 'Argument for dev.flutter.pigeon.SystemServicesFlutterApi.onCameraError was null.'); final List args = (message as List?)!; final String? arg_errorDescription = (args[0] as String?); assert(arg_errorDescription != null, @@ -836,9 +872,9 @@ class _PreviewHostApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return ResolutionInfo.decode(readValue(buffer)!); - case 129: + case 129: return ResolutionInfo.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -856,14 +892,12 @@ class PreviewHostApi { static const MessageCodec codec = _PreviewHostApiCodec(); - Future create(int arg_identifier, int? arg_rotation, - ResolutionInfo? arg_targetResolution) async { + Future create(int arg_identifier, int? arg_rotation, ResolutionInfo? arg_targetResolution) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.PreviewHostApi.create', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_identifier, arg_rotation, arg_targetResolution]) - as List?; + final List? replyList = + await channel.send([arg_identifier, arg_rotation, arg_targetResolution]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -911,7 +945,8 @@ class PreviewHostApi { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.PreviewHostApi.releaseFlutterSurfaceTexture', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel.send(null) as List?; + final List? replyList = + await channel.send(null) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -971,7 +1006,7 @@ class _ImageCaptureHostApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return ResolutionInfo.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -989,14 +1024,12 @@ class ImageCaptureHostApi { static const MessageCodec codec = _ImageCaptureHostApiCodec(); - Future create(int arg_identifier, int? arg_flashMode, - ResolutionInfo? arg_targetResolution) async { + Future create(int arg_identifier, int? arg_flashMode, ResolutionInfo? arg_targetResolution) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImageCaptureHostApi.create', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel.send( - [arg_identifier, arg_flashMode, arg_targetResolution]) - as List?; + final List? replyList = + await channel.send([arg_identifier, arg_flashMode, arg_targetResolution]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -1017,8 +1050,8 @@ class ImageCaptureHostApi { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImageCaptureHostApi.setFlashMode', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_identifier, arg_flashMode]) as List?; + final List? replyList = + await channel.send([arg_identifier, arg_flashMode]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -1078,7 +1111,98 @@ class _ExposureStateFlutterApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: + return ExposureCompensationRange.decode(readValue(buffer)!); + default: + return super.readValueOfType(type, buffer); + } + } +} + +abstract class ExposureStateFlutterApi { + static const MessageCodec codec = _ExposureStateFlutterApiCodec(); + + void create(int identifier, ExposureCompensationRange exposureCompensationRange, double exposureCompensationStep); + + static void setup(ExposureStateFlutterApi? api, {BinaryMessenger? binaryMessenger}) { + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.ExposureStateFlutterApi.create', codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMessageHandler(null); + } else { + channel.setMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.ExposureStateFlutterApi.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.ExposureStateFlutterApi.create was null, expected non-null int.'); + final ExposureCompensationRange? arg_exposureCompensationRange = (args[1] as ExposureCompensationRange?); + assert(arg_exposureCompensationRange != null, + 'Argument for dev.flutter.pigeon.ExposureStateFlutterApi.create was null, expected non-null ExposureCompensationRange.'); + final double? arg_exposureCompensationStep = (args[2] as double?); + assert(arg_exposureCompensationStep != null, + 'Argument for dev.flutter.pigeon.ExposureStateFlutterApi.create was null, expected non-null double.'); + api.create(arg_identifier!, arg_exposureCompensationRange!, arg_exposureCompensationStep!); + return; + }); + } + } + } +} + +abstract class ZoomStateFlutterApi { + static const MessageCodec codec = StandardMessageCodec(); + + void create(int identifier, double minZoomRatio, double maxZoomRatio); + + static void setup(ZoomStateFlutterApi? api, {BinaryMessenger? binaryMessenger}) { + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.ZoomStateFlutterApi.create', codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMessageHandler(null); + } else { + channel.setMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.ZoomStateFlutterApi.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.ZoomStateFlutterApi.create was null, expected non-null int.'); + final double? arg_minZoomRatio = (args[1] as double?); + assert(arg_minZoomRatio != null, + 'Argument for dev.flutter.pigeon.ZoomStateFlutterApi.create was null, expected non-null double.'); + final double? arg_maxZoomRatio = (args[2] as double?); + assert(arg_maxZoomRatio != null, + 'Argument for dev.flutter.pigeon.ZoomStateFlutterApi.create was null, expected non-null double.'); + api.create(arg_identifier!, arg_minZoomRatio!, arg_maxZoomRatio!); + return; + }); + } + } + } +} + +class _ExposureStateFlutterApiCodec extends StandardMessageCodec { + const _ExposureStateFlutterApiCodec(); + @override + void writeValue(WriteBuffer buffer, Object? value) { + if (value is ExposureCompensationRange) { + buffer.putUint8(128); + writeValue(buffer, value.encode()); + } else { + super.writeValue(buffer, value); + } + } + + @override + Object? readValueOfType(int type, ReadBuffer buffer) { + switch (type) { + case 128: return ExposureCompensationRange.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -1089,13 +1213,9 @@ class _ExposureStateFlutterApiCodec extends StandardMessageCodec { abstract class ExposureStateFlutterApi { static const MessageCodec codec = _ExposureStateFlutterApiCodec(); - void create( - int identifier, - ExposureCompensationRange exposureCompensationRange, - double exposureCompensationStep); + void create(int identifier, ExposureCompensationRange exposureCompensationRange, double exposureCompensationStep); - static void setup(ExposureStateFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(ExposureStateFlutterApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ExposureStateFlutterApi.create', codec, @@ -1105,20 +1225,18 @@ abstract class ExposureStateFlutterApi { } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ExposureStateFlutterApi.create was null.'); + 'Argument for dev.flutter.pigeon.ExposureStateFlutterApi.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.ExposureStateFlutterApi.create was null, expected non-null int.'); - final ExposureCompensationRange? arg_exposureCompensationRange = - (args[1] as ExposureCompensationRange?); + final ExposureCompensationRange? arg_exposureCompensationRange = (args[1] as ExposureCompensationRange?); assert(arg_exposureCompensationRange != null, 'Argument for dev.flutter.pigeon.ExposureStateFlutterApi.create was null, expected non-null ExposureCompensationRange.'); final double? arg_exposureCompensationStep = (args[2] as double?); assert(arg_exposureCompensationStep != null, 'Argument for dev.flutter.pigeon.ExposureStateFlutterApi.create was null, expected non-null double.'); - api.create(arg_identifier!, arg_exposureCompensationRange!, - arg_exposureCompensationStep!); + api.create(arg_identifier!, arg_exposureCompensationRange!, arg_exposureCompensationStep!); return; }); } @@ -1131,8 +1249,7 @@ abstract class ZoomStateFlutterApi { void create(int identifier, double minZoomRatio, double maxZoomRatio); - static void setup(ZoomStateFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(ZoomStateFlutterApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ZoomStateFlutterApi.create', codec, @@ -1142,7 +1259,7 @@ abstract class ZoomStateFlutterApi { } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ZoomStateFlutterApi.create was null.'); + 'Argument for dev.flutter.pigeon.ZoomStateFlutterApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -1176,7 +1293,7 @@ class _ImageAnalysisHostApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return ResolutionInfo.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -1194,14 +1311,12 @@ class ImageAnalysisHostApi { static const MessageCodec codec = _ImageAnalysisHostApiCodec(); - Future create(int arg_identifier, - ResolutionInfo? arg_targetResolutionIdentifier) async { + Future create(int arg_identifier, ResolutionInfo? arg_targetResolutionIdentifier) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImageAnalysisHostApi.create', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_identifier, arg_targetResolutionIdentifier]) - as List?; + final List? replyList = + await channel.send([arg_identifier, arg_targetResolutionIdentifier]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -1218,14 +1333,12 @@ class ImageAnalysisHostApi { } } - Future setAnalyzer( - int arg_identifier, int arg_analyzerIdentifier) async { + Future setAnalyzer(int arg_identifier, int arg_analyzerIdentifier) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImageAnalysisHostApi.setAnalyzer', codec, binaryMessenger: _binaryMessenger); final List? replyList = - await channel.send([arg_identifier, arg_analyzerIdentifier]) - as List?; + await channel.send([arg_identifier, arg_analyzerIdentifier]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -1305,8 +1418,7 @@ abstract class AnalyzerFlutterApi { void analyze(int identifier, int imageProxyIdentifier); - static void setup(AnalyzerFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(AnalyzerFlutterApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.AnalyzerFlutterApi.create', codec, @@ -1316,7 +1428,7 @@ abstract class AnalyzerFlutterApi { } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.AnalyzerFlutterApi.create was null.'); + 'Argument for dev.flutter.pigeon.AnalyzerFlutterApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -1335,7 +1447,7 @@ abstract class AnalyzerFlutterApi { } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.AnalyzerFlutterApi.analyze was null.'); + 'Argument for dev.flutter.pigeon.AnalyzerFlutterApi.analyze was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -1416,8 +1528,7 @@ abstract class ImageProxyFlutterApi { void create(int identifier, int format, int height, int width); - static void setup(ImageProxyFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(ImageProxyFlutterApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImageProxyFlutterApi.create', codec, @@ -1427,7 +1538,7 @@ abstract class ImageProxyFlutterApi { } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImageProxyFlutterApi.create was null.'); + 'Argument for dev.flutter.pigeon.ImageProxyFlutterApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -1454,8 +1565,7 @@ abstract class PlaneProxyFlutterApi { void create(int identifier, Uint8List buffer, int pixelStride, int rowStride); - static void setup(PlaneProxyFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(PlaneProxyFlutterApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.PlaneProxyFlutterApi.create', codec, @@ -1465,7 +1575,7 @@ abstract class PlaneProxyFlutterApi { } else { channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.PlaneProxyFlutterApi.create was null.'); + 'Argument for dev.flutter.pigeon.PlaneProxyFlutterApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -1479,8 +1589,7 @@ abstract class PlaneProxyFlutterApi { final int? arg_rowStride = (args[3] as int?); assert(arg_rowStride != null, 'Argument for dev.flutter.pigeon.PlaneProxyFlutterApi.create was null, expected non-null int.'); - api.create( - arg_identifier!, arg_buffer!, arg_pixelStride!, arg_rowStride!); + api.create(arg_identifier!, arg_buffer!, arg_pixelStride!, arg_rowStride!); return; }); } diff --git a/packages/camera/camera_android_camerax/pigeons/camerax_library.dart b/packages/camera/camera_android_camerax/pigeons/camerax_library.dart index c8b3885d064b..8e4b0ca7431f 100644 --- a/packages/camera/camera_android_camerax/pigeons/camerax_library.dart +++ b/packages/camera/camera_android_camerax/pigeons/camerax_library.dart @@ -56,6 +56,16 @@ class ExposureCompensationRange { int maxCompensation; } +class ExposureCompensationRange { + ExposureCompensationRange({ + required this.minCompensation, + required this.maxCompensation, + }); + + int minCompensation; + int maxCompensation; +} + @HostApi(dartHostTestHandler: 'TestInstanceManagerHostApi') abstract class InstanceManagerHostApi { /// Clear the native `InstanceManager`. @@ -78,6 +88,8 @@ abstract class JavaObjectFlutterApi { abstract class CameraInfoHostApi { int getSensorRotationDegrees(int identifier); + int getLiveCameraState(int identifier); + int getExposureState(int identifier); int getZoomState(int identifier); @@ -184,6 +196,19 @@ abstract class ZoomStateFlutterApi { void create(int identifier, double minZoomRatio, double maxZoomRatio); } +@FlutterApi() +abstract class ExposureStateFlutterApi { + void create( + int identifier, + ExposureCompensationRange exposureCompensationRange, + double exposureCompensationStep); +} + +@FlutterApi() +abstract class ZoomStateFlutterApi { + void create(int identifier, double minZoomRatio, double maxZoomRatio); +} + @HostApi(dartHostTestHandler: 'TestImageAnalysisHostApi') abstract class ImageAnalysisHostApi { void create(int identifier, ResolutionInfo? targetResolutionIdentifier); diff --git a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart index e7a6707d6e3f..079abe0f2fd4 100644 --- a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart +++ b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart @@ -132,12 +132,19 @@ void main() { camera.processCameraProvider = mockProcessCameraProvider; + camera.processCameraProvider = mockProcessCameraProvider; + when(camera.testPreview.setSurfaceProvider()) .thenAnswer((_) async => testSurfaceTextureId); - when(mockProcessCameraProvider.bindToLifecycle(any, any)) - .thenAnswer((_) => Future.value(mockCamera)); - when(mockCamera.getCameraInfo()) - .thenAnswer((_) => Future.value(MockCameraInfo())); + when(mockProcessCameraProvider.bindToLifecycle( + camera.mockBackCameraSelector, + [camera.testPreview, camera.testImageCapture])) + .thenAnswer((_) async => mockCamera); + when(mockCamera.getCameraInfo()).thenAnswer((_) async => mockCameraInfo); + when(mockCameraInfo.getLiveCameraState()) + .thenAnswer((_) async => mockLiveCameraState); + camera.processCameraProvider = mockProcessCameraProvider; + camera.createDetachedObjectForTesting = true; expect( await camera.createCamera(testCameraDescription, testResolutionPreset, @@ -165,7 +172,7 @@ void main() { 'createCamera binds Preview and ImageCapture use cases to ProcessCameraProvider instance', () async { final MockAndroidCameraCameraX camera = MockAndroidCameraCameraX(); - final MockProcessCameraProvider mockProcessCameraProvider = + final ProcessCameraProvider mockProcessCameraProvider = MockProcessCameraProvider(); final MockCamera mockCamera = MockCamera(); final MockCameraInfo mockCameraInfo = MockCameraInfo(); @@ -178,6 +185,16 @@ void main() { const ResolutionPreset testResolutionPreset = ResolutionPreset.veryHigh; const bool enableAudio = true; + when(mockProcessCameraProvider.bindToLifecycle( + camera.mockBackCameraSelector, + [camera.testPreview, camera.testImageCapture])) + .thenAnswer((_) async => mockCamera); + when(mockCamera.getCameraInfo()).thenAnswer((_) async => mockCameraInfo); + when(mockCameraInfo.getLiveCameraState()) + .thenAnswer((_) async => MockLiveData()); + camera.processCameraProvider = mockProcessCameraProvider; + camera.createDetachedObjectForTesting = true; + camera.processCameraProvider = mockProcessCameraProvider; when(mockProcessCameraProvider.bindToLifecycle( @@ -254,6 +271,16 @@ void main() { await camera.createCamera(testCameraDescription, testResolutionPreset, enableAudio: enableAudio); + when(mockProcessCameraProvider.bindToLifecycle(any, any)) + .thenAnswer((_) async => mockCamera); + when(mockCamera.getCameraInfo()) + .thenAnswer((_) => Future.value(MockCameraInfo())); + when(camera.testPreview.getResolutionInfo()) + .thenAnswer((_) async => testResolutionInfo); + + await camera.createCamera(testCameraDescription, testResolutionPreset, + enableAudio: enableAudio); + // Start listening to camera events stream to verify the proper CameraInitializedEvent is sent. camera.cameraEventStreamController.stream.listen((CameraEvent event) { expect(event, const TypeMatcher()); @@ -381,6 +408,7 @@ void main() { verifyNever(camera.processCameraProvider! .bindToLifecycle(camera.cameraSelector!, [camera.preview!])); + verifyNever(mockLiveCameraState.observe(any)); expect(camera.cameraInfo, isNot(mockCameraInfo)); }); @@ -396,6 +424,11 @@ void main() { camera.cameraSelector = MockCameraSelector(); camera.preview = MockPreview(); + when(mockProcessCameraProvider.bindToLifecycle(any, any)) + .thenAnswer((_) => Future.value(mockCamera)); + when(mockCamera.getCameraInfo()) + .thenAnswer((_) => Future.value(mockCameraInfo)); + when(mockProcessCameraProvider.bindToLifecycle(any, any)) .thenAnswer((_) => Future.value(mockCamera)); when(mockCamera.getCameraInfo()) @@ -405,6 +438,13 @@ void main() { verify(camera.processCameraProvider! .bindToLifecycle(camera.cameraSelector!, [camera.preview!])); + expect( + await testCameraClosingObserver( + camera, + 78, + verify(mockLiveCameraState.observe(captureAny)).captured.single + as Observer), + isTrue); expect(camera.cameraInfo, equals(mockCameraInfo)); }); @@ -421,6 +461,11 @@ void main() { camera.cameraSelector = MockCameraSelector(); camera.preview = MockPreview(); + when(mockProcessCameraProvider.bindToLifecycle(any, any)) + .thenAnswer((_) => Future.value(mockCamera)); + when(mockCamera.getCameraInfo()) + .thenAnswer((_) => Future.value(MockCameraInfo())); + when(mockProcessCameraProvider.bindToLifecycle(any, any)) .thenAnswer((_) => Future.value(mockCamera)); when(mockCamera.getCameraInfo()) @@ -457,6 +502,11 @@ void main() { camera.cameraSelector = MockCameraSelector(); camera.preview = MockPreview(); + when(mockProcessCameraProvider.bindToLifecycle(any, any)) + .thenAnswer((_) => Future.value(mockCamera)); + when(mockCamera.getCameraInfo()) + .thenAnswer((_) => Future.value(mockCameraInfo)); + when(mockProcessCameraProvider.bindToLifecycle(any, any)) .thenAnswer((_) => Future.value(mockCamera)); when(mockCamera.getCameraInfo()) @@ -581,6 +631,11 @@ void main() { camera.cameraSelector = MockCameraSelector(); camera.createDetachedCallbacks = true; + when(mockProcessCameraProvider.bindToLifecycle(any, any)) + .thenAnswer((_) => Future.value(mockCamera)); + when(mockCamera.getCameraInfo()) + .thenAnswer((_) => Future.value(MockCameraInfo())); + when(mockProcessCameraProvider.bindToLifecycle(any, any)) .thenAnswer((_) => Future.value(mockCamera)); when(mockCamera.getCameraInfo()) diff --git a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.mocks.dart b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.mocks.dart index b7365a2e90d4..0c88413c1ad6 100644 --- a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.mocks.dart +++ b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.mocks.dart @@ -203,6 +203,15 @@ class MockCameraInfo extends _i1.Mock implements _i2.CameraInfo { returnValueForMissingStub: _i11.Future.value(0), ) as _i11.Future); @override + _i11.Future getLiveCameraState() => (super.noSuchMethod( + Invocation.method( + #getLiveCameraState, + [], + ), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + @override _i11.Future<_i3.ExposureState> getExposureState() => (super.noSuchMethod( Invocation.method( #getExposureState, diff --git a/packages/camera/camera_android_camerax/test/camera_info_test.dart b/packages/camera/camera_android_camerax/test/camera_info_test.dart index 9826b88e367e..7edf6c409fe0 100644 --- a/packages/camera/camera_android_camerax/test/camera_info_test.dart +++ b/packages/camera/camera_android_camerax/test/camera_info_test.dart @@ -6,6 +6,7 @@ import 'package:camera_android_camerax/src/camera_info.dart'; import 'package:camera_android_camerax/src/camerax_library.g.dart'; import 'package:camera_android_camerax/src/exposure_state.dart'; import 'package:camera_android_camerax/src/instance_manager.dart'; +import 'package:camera_android_camerax/src/live_data.dart'; import 'package:camera_android_camerax/src/zoom_state.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; diff --git a/packages/camera/camera_android_camerax/test/camera_info_test.mocks.dart b/packages/camera/camera_android_camerax/test/camera_info_test.mocks.dart index 968dc6e8b621..4c1bdf696938 100644 --- a/packages/camera/camera_android_camerax/test/camera_info_test.mocks.dart +++ b/packages/camera/camera_android_camerax/test/camera_info_test.mocks.dart @@ -36,6 +36,14 @@ class MockTestCameraInfoHostApi extends _i1.Mock returnValue: 0, ) as int); @override + int getLiveCameraState(int? identifier) => (super.noSuchMethod( + Invocation.method( + #getLiveCameraState, + [identifier], + ), + returnValue: 0, + ) as int); + @override int getExposureState(int? identifier) => (super.noSuchMethod( Invocation.method( #getExposureState, diff --git a/packages/camera/camera_android_camerax/test/camera_test.dart b/packages/camera/camera_android_camerax/test/camera_test.dart index 742a60799e6f..05f5fe7dd029 100644 --- a/packages/camera/camera_android_camerax/test/camera_test.dart +++ b/packages/camera/camera_android_camerax/test/camera_test.dart @@ -20,6 +20,8 @@ void main() { TestInstanceManagerHostApi.setup(MockTestInstanceManagerHostApi()); group('Camera', () { + tearDown(() => TestCameraHostApi.setup(null)); + test('getCameraInfo makes call to retrieve expected CameraInfo', () async { final MockTestCameraHostApi mockApi = MockTestCameraHostApi(); TestCameraHostApi.setup(mockApi); @@ -52,7 +54,7 @@ void main() { verify(mockApi.getCameraInfo(cameraIdentifier)); }); - test('flutterApiCreateTest', () { + test('flutterApiCreate makes call to add instance to instance manager', () { final InstanceManager instanceManager = InstanceManager( onWeakReferenceRemoved: (_) {}, ); diff --git a/packages/camera/camera_android_camerax/test/test_camerax_library.g.dart b/packages/camera/camera_android_camerax/test/test_camerax_library.g.dart index 40bd8f2e4335..098b297bcf0a 100644 --- a/packages/camera/camera_android_camerax/test/test_camerax_library.g.dart +++ b/packages/camera/camera_android_camerax/test/test_camerax_library.g.dart @@ -14,8 +14,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:camera_android_camerax/src/camerax_library.g.dart'; abstract class TestInstanceManagerHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); /// Clear the native `InstanceManager`. @@ -23,19 +22,15 @@ abstract class TestInstanceManagerHostApi { /// This is typically only used after a hot restart. void clear(); - static void setup(TestInstanceManagerHostApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestInstanceManagerHostApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.InstanceManagerHostApi.clear', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { // ignore message api.clear(); return []; @@ -46,27 +41,22 @@ abstract class TestInstanceManagerHostApi { } abstract class TestJavaObjectHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); 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); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.JavaObjectHostApi.dispose was 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, @@ -80,32 +70,28 @@ abstract class TestJavaObjectHostApi { } abstract class TestCameraInfoHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); int getSensorRotationDegrees(int identifier); + int getLiveCameraState(int identifier); + int getExposureState(int identifier); int getZoomState(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, + 'dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees was 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, @@ -115,19 +101,35 @@ abstract class TestCameraInfoHostApi { }); } } + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.CameraInfoHostApi.getLiveCameraState', codec, + binaryMessenger: binaryMessenger); + if (api == null) { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); + } else { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getLiveCameraState 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.getLiveCameraState was null, expected non-null int.'); + final int output = api.getLiveCameraState(arg_identifier!); + return [output]; + }); + } + } { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.CameraInfoHostApi.getExposureState', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getExposureState was null.'); + 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getExposureState was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -142,14 +144,11 @@ abstract class TestCameraInfoHostApi { 'dev.flutter.pigeon.CameraInfoHostApi.getZoomState', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getZoomState was null.'); + 'Argument for dev.flutter.pigeon.CameraInfoHostApi.getZoomState was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -163,29 +162,24 @@ abstract class TestCameraInfoHostApi { } abstract class TestCameraSelectorHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); 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); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.create was 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, @@ -201,24 +195,19 @@ abstract class TestCameraSelectorHostApi { 'dev.flutter.pigeon.CameraSelectorHostApi.filter', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was 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(); + 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!); + final List output = api.filter(arg_identifier!, arg_cameraInfoIds!); return [output]; }); } @@ -227,16 +216,14 @@ abstract class TestCameraSelectorHostApi { } abstract class TestProcessCameraProviderHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); Future getInstance(); List getAvailableCameraInfos(int identifier); - int bindToLifecycle( - int identifier, int cameraSelectorIdentifier, List useCaseIds); + int bindToLifecycle(int identifier, int cameraSelectorIdentifier, List useCaseIds); bool isBound(int identifier, int useCaseIdentifier); @@ -244,19 +231,15 @@ abstract class TestProcessCameraProviderHostApi { void unbindAll(int identifier); - 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); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { // ignore message final int output = await api.getInstance(); return [output]; @@ -265,42 +248,33 @@ abstract class TestProcessCameraProviderHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', - codec, + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos was null.'); + 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos 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.ProcessCameraProviderHostApi.getAvailableCameraInfos was null, expected non-null int.'); - final List output = - api.getAvailableCameraInfos(arg_identifier!); + final List output = api.getAvailableCameraInfos(arg_identifier!); return [output]; }); } } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ProcessCameraProviderHostApi.bindToLifecycle', - codec, + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.bindToLifecycle', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.bindToLifecycle was null.'); + 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.bindToLifecycle was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -308,12 +282,10 @@ abstract class TestProcessCameraProviderHostApi { final int? arg_cameraSelectorIdentifier = (args[1] as int?); assert(arg_cameraSelectorIdentifier != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.bindToLifecycle was null, expected non-null int.'); - final List? arg_useCaseIds = - (args[2] as List?)?.cast(); + final List? arg_useCaseIds = (args[2] as List?)?.cast(); assert(arg_useCaseIds != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.bindToLifecycle was null, expected non-null List.'); - final int output = api.bindToLifecycle( - arg_identifier!, arg_cameraSelectorIdentifier!, arg_useCaseIds!); + final int output = api.bindToLifecycle(arg_identifier!, arg_cameraSelectorIdentifier!, arg_useCaseIds!); return [output]; }); } @@ -323,14 +295,11 @@ abstract class TestProcessCameraProviderHostApi { 'dev.flutter.pigeon.ProcessCameraProviderHostApi.isBound', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.isBound was null.'); + 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.isBound was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -338,8 +307,7 @@ abstract class TestProcessCameraProviderHostApi { final int? arg_useCaseIdentifier = (args[1] as int?); assert(arg_useCaseIdentifier != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.isBound was null, expected non-null int.'); - final bool output = - api.isBound(arg_identifier!, arg_useCaseIdentifier!); + final bool output = api.isBound(arg_identifier!, arg_useCaseIdentifier!); return [output]; }); } @@ -349,20 +317,16 @@ abstract class TestProcessCameraProviderHostApi { 'dev.flutter.pigeon.ProcessCameraProviderHostApi.unbind', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.unbind was null.'); + 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.unbind 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.ProcessCameraProviderHostApi.unbind was null, expected non-null int.'); - final List? arg_useCaseIds = - (args[1] as List?)?.cast(); + final List? arg_useCaseIds = (args[1] as List?)?.cast(); assert(arg_useCaseIds != null, 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.unbind was null, expected non-null List.'); api.unbind(arg_identifier!, arg_useCaseIds!); @@ -375,14 +339,11 @@ abstract class TestProcessCameraProviderHostApi { 'dev.flutter.pigeon.ProcessCameraProviderHostApi.unbindAll', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.unbindAll was null.'); + 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.unbindAll was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -396,27 +357,22 @@ abstract class TestProcessCameraProviderHostApi { } abstract class TestCameraHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); int getCameraInfo(int identifier); - static void setup(TestCameraHostApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestCameraHostApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.CameraHostApi.getCameraInfo', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.CameraHostApi.getCameraInfo was null.'); + 'Argument for dev.flutter.pigeon.CameraHostApi.getCameraInfo was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -444,7 +400,7 @@ class _TestSystemServicesHostApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return CameraPermissionsErrorData.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -453,58 +409,45 @@ class _TestSystemServicesHostApiCodec extends StandardMessageCodec { } abstract class TestSystemServicesHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = _TestSystemServicesHostApiCodec(); - Future requestCameraPermissions( - bool enableAudio); + Future requestCameraPermissions(bool enableAudio); - void startListeningForDeviceOrientationChange( - bool isFrontFacing, int sensorOrientation); + void startListeningForDeviceOrientationChange(bool isFrontFacing, int sensorOrientation); void stopListeningForDeviceOrientationChange(); - static void setup(TestSystemServicesHostApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestSystemServicesHostApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.SystemServicesHostApi.requestCameraPermissions', - codec, + 'dev.flutter.pigeon.SystemServicesHostApi.requestCameraPermissions', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.SystemServicesHostApi.requestCameraPermissions was null.'); + 'Argument for dev.flutter.pigeon.SystemServicesHostApi.requestCameraPermissions was null.'); final List args = (message as List?)!; final bool? arg_enableAudio = (args[0] as bool?); assert(arg_enableAudio != null, 'Argument for dev.flutter.pigeon.SystemServicesHostApi.requestCameraPermissions was null, expected non-null bool.'); - final CameraPermissionsErrorData? output = - await api.requestCameraPermissions(arg_enableAudio!); + final CameraPermissionsErrorData? output = await api.requestCameraPermissions(arg_enableAudio!); return [output]; }); } } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.SystemServicesHostApi.startListeningForDeviceOrientationChange', - codec, + 'dev.flutter.pigeon.SystemServicesHostApi.startListeningForDeviceOrientationChange', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.SystemServicesHostApi.startListeningForDeviceOrientationChange was null.'); + 'Argument for dev.flutter.pigeon.SystemServicesHostApi.startListeningForDeviceOrientationChange was null.'); final List args = (message as List?)!; final bool? arg_isFrontFacing = (args[0] as bool?); assert(arg_isFrontFacing != null, @@ -512,24 +455,19 @@ abstract class TestSystemServicesHostApi { final int? arg_sensorOrientation = (args[1] as int?); assert(arg_sensorOrientation != null, 'Argument for dev.flutter.pigeon.SystemServicesHostApi.startListeningForDeviceOrientationChange was null, expected non-null int.'); - api.startListeningForDeviceOrientationChange( - arg_isFrontFacing!, arg_sensorOrientation!); + api.startListeningForDeviceOrientationChange(arg_isFrontFacing!, arg_sensorOrientation!); return []; }); } } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.SystemServicesHostApi.stopListeningForDeviceOrientationChange', - codec, + 'dev.flutter.pigeon.SystemServicesHostApi.stopListeningForDeviceOrientationChange', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { // ignore message api.stopListeningForDeviceOrientationChange(); return []; @@ -557,9 +495,9 @@ class _TestPreviewHostApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return ResolutionInfo.decode(readValue(buffer)!); - case 129: + case 129: return ResolutionInfo.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -568,8 +506,7 @@ class _TestPreviewHostApiCodec extends StandardMessageCodec { } abstract class TestPreviewHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = _TestPreviewHostApiCodec(); void create(int identifier, int? rotation, ResolutionInfo? targetResolution); @@ -580,28 +517,23 @@ abstract class TestPreviewHostApi { ResolutionInfo getResolutionInfo(int identifier); - static void setup(TestPreviewHostApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestPreviewHostApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.PreviewHostApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.PreviewHostApi.create was null.'); + 'Argument for dev.flutter.pigeon.PreviewHostApi.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.PreviewHostApi.create was null, expected non-null int.'); final int? arg_rotation = (args[1] as int?); - final ResolutionInfo? arg_targetResolution = - (args[2] as ResolutionInfo?); + final ResolutionInfo? arg_targetResolution = (args[2] as ResolutionInfo?); api.create(arg_identifier!, arg_rotation, arg_targetResolution); return []; }); @@ -612,14 +544,11 @@ abstract class TestPreviewHostApi { 'dev.flutter.pigeon.PreviewHostApi.setSurfaceProvider', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.PreviewHostApi.setSurfaceProvider was null.'); + 'Argument for dev.flutter.pigeon.PreviewHostApi.setSurfaceProvider was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -631,16 +560,12 @@ abstract class TestPreviewHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.PreviewHostApi.releaseFlutterSurfaceTexture', - codec, + 'dev.flutter.pigeon.PreviewHostApi.releaseFlutterSurfaceTexture', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { // ignore message api.releaseFlutterSurfaceTexture(); return []; @@ -652,14 +577,11 @@ abstract class TestPreviewHostApi { 'dev.flutter.pigeon.PreviewHostApi.getResolutionInfo', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.PreviewHostApi.getResolutionInfo was null.'); + 'Argument for dev.flutter.pigeon.PreviewHostApi.getResolutionInfo was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -687,7 +609,7 @@ class _TestImageCaptureHostApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return ResolutionInfo.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -696,8 +618,7 @@ class _TestImageCaptureHostApiCodec extends StandardMessageCodec { } abstract class TestImageCaptureHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = _TestImageCaptureHostApiCodec(); void create(int identifier, int? flashMode, ResolutionInfo? targetResolution); @@ -706,28 +627,23 @@ abstract class TestImageCaptureHostApi { Future takePicture(int identifier); - static void setup(TestImageCaptureHostApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestImageCaptureHostApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImageCaptureHostApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImageCaptureHostApi.create was null.'); + 'Argument for dev.flutter.pigeon.ImageCaptureHostApi.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.ImageCaptureHostApi.create was null, expected non-null int.'); final int? arg_flashMode = (args[1] as int?); - final ResolutionInfo? arg_targetResolution = - (args[2] as ResolutionInfo?); + final ResolutionInfo? arg_targetResolution = (args[2] as ResolutionInfo?); api.create(arg_identifier!, arg_flashMode, arg_targetResolution); return []; }); @@ -738,14 +654,11 @@ abstract class TestImageCaptureHostApi { 'dev.flutter.pigeon.ImageCaptureHostApi.setFlashMode', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImageCaptureHostApi.setFlashMode was null.'); + 'Argument for dev.flutter.pigeon.ImageCaptureHostApi.setFlashMode was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -763,14 +676,11 @@ abstract class TestImageCaptureHostApi { 'dev.flutter.pigeon.ImageCaptureHostApi.takePicture', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImageCaptureHostApi.takePicture was null.'); + 'Argument for dev.flutter.pigeon.ImageCaptureHostApi.takePicture was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -798,7 +708,7 @@ class _TestImageAnalysisHostApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return ResolutionInfo.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -807,8 +717,7 @@ class _TestImageAnalysisHostApiCodec extends StandardMessageCodec { } abstract class TestImageAnalysisHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = _TestImageAnalysisHostApiCodec(); void create(int identifier, ResolutionInfo? targetResolutionIdentifier); @@ -817,27 +726,22 @@ abstract class TestImageAnalysisHostApi { void clearAnalyzer(int identifier); - static void setup(TestImageAnalysisHostApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestImageAnalysisHostApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImageAnalysisHostApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImageAnalysisHostApi.create was null.'); + 'Argument for dev.flutter.pigeon.ImageAnalysisHostApi.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.ImageAnalysisHostApi.create was null, expected non-null int.'); - final ResolutionInfo? arg_targetResolutionIdentifier = - (args[1] as ResolutionInfo?); + final ResolutionInfo? arg_targetResolutionIdentifier = (args[1] as ResolutionInfo?); api.create(arg_identifier!, arg_targetResolutionIdentifier); return []; }); @@ -848,14 +752,11 @@ abstract class TestImageAnalysisHostApi { 'dev.flutter.pigeon.ImageAnalysisHostApi.setAnalyzer', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImageAnalysisHostApi.setAnalyzer was null.'); + 'Argument for dev.flutter.pigeon.ImageAnalysisHostApi.setAnalyzer was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -873,14 +774,11 @@ abstract class TestImageAnalysisHostApi { 'dev.flutter.pigeon.ImageAnalysisHostApi.clearAnalyzer', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImageAnalysisHostApi.clearAnalyzer was null.'); + 'Argument for dev.flutter.pigeon.ImageAnalysisHostApi.clearAnalyzer was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -894,27 +792,22 @@ abstract class TestImageAnalysisHostApi { } abstract class TestAnalyzerHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); void create(int identifier); - static void setup(TestAnalyzerHostApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestAnalyzerHostApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.AnalyzerHostApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.AnalyzerHostApi.create was null.'); + 'Argument for dev.flutter.pigeon.AnalyzerHostApi.create was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -928,29 +821,24 @@ abstract class TestAnalyzerHostApi { } abstract class TestImageProxyHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); List getPlanes(int identifier); void close(int identifier); - static void setup(TestImageProxyHostApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setup(TestImageProxyHostApi? api, {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.ImageProxyHostApi.getPlanes', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImageProxyHostApi.getPlanes was null.'); + 'Argument for dev.flutter.pigeon.ImageProxyHostApi.getPlanes was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, @@ -965,14 +853,11 @@ abstract class TestImageProxyHostApi { 'dev.flutter.pigeon.ImageProxyHostApi.close', codec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.ImageProxyHostApi.close was null.'); + 'Argument for dev.flutter.pigeon.ImageProxyHostApi.close was null.'); final List args = (message as List?)!; final int? arg_identifier = (args[0] as int?); assert(arg_identifier != null, From fed96215bdf28cd0d04913c07060091a9fb74e84 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 10 May 2023 09:39:45 -0700 Subject: [PATCH 02/28] Undo changes --- .../camerax/CameraInfoHostApiImpl.java | 36 - .../camerax/GeneratedCameraXLibrary.java | 618 +++++++++--------- .../lib/src/android_camera_camerax.dart | 49 -- ...roid_camera_camerax_flutter_api_impls.dart | 6 - .../lib/src/camera_info.dart | 17 - .../lib/src/camerax_library.g.dart | 124 ---- .../pigeons/camerax_library.dart | 23 - .../test/android_camera_camerax_test.dart | 42 -- 8 files changed, 291 insertions(+), 624 deletions(-) diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoHostApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoHostApiImpl.java index f9eca979d909..e72d08da34d1 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoHostApiImpl.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoHostApiImpl.java @@ -92,40 +92,4 @@ public Long getZoomState(@NonNull Long identifier) { return instanceManager.getIdentifierForStrongReference(zoomState); } - - /** - * Retrieves the {@link ExposureState} of the {@link CameraInfo} with the specified identifier. - */ - @Override - @NonNull - public Long getExposureState(@NonNull Long identifier) { - CameraInfo cameraInfo = - (CameraInfo) Objects.requireNonNull(instanceManager.getInstance(identifier)); - ExposureState exposureState = cameraInfo.getExposureState(); - - ExposureStateFlutterApiImpl exposureStateFlutterApiImpl = - new ExposureStateFlutterApiImpl(binaryMessenger, instanceManager); - exposureStateFlutterApiImpl.create(exposureState, result -> {}); - - return instanceManager.getIdentifierForStrongReference(exposureState); - } - - /** - * Retrieves the current {@link ZoomState} value of the {@link CameraInfo} with the specified - * identifier. - */ - @NonNull - @Override - public Long getZoomState(@NonNull Long identifier) { - CameraInfo cameraInfo = - (CameraInfo) Objects.requireNonNull(instanceManager.getInstance(identifier)); - // TODO(camsim99): Create/return LiveData once https://github.com/flutter/packages/pull/3419 lands. - ZoomState zoomState = cameraInfo.getZoomState().getValue(); - - ZoomStateFlutterApiImpl zoomStateFlutterApiImpl = - new ZoomStateFlutterApiImpl(binaryMessenger, instanceManager); - zoomStateFlutterApiImpl.create(zoomState, result -> {}); - - return instanceManager.getIdentifierForStrongReference(zoomState); - } } 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 8b505930f37c..c6f627993772 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 @@ -18,9 +18,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** Generated class from Pigeon. */ @SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) @@ -35,8 +33,7 @@ public static class FlutterError extends RuntimeException { /** The error details. Must be a datatype supported by the api codec. */ public final Object details; - public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) - { + public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) { super(message); this.code = code; this.details = details; @@ -55,7 +52,7 @@ protected static ArrayList wrapError(@NonNull Throwable exception) { errorList.add(exception.toString()); errorList.add(exception.getClass().getSimpleName()); errorList.add( - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); } return errorList; } @@ -156,9 +153,13 @@ ArrayList toList() { static @NonNull ResolutionInfo fromList(@NonNull ArrayList list) { ResolutionInfo pigeonResult = new ResolutionInfo(); Object width = list.get(0); - pigeonResult.setWidth((width == null) ? null : ((width instanceof Integer) ? (Integer) width : (Long) width)); + pigeonResult.setWidth( + (width == null) ? null : ((width instanceof Integer) ? (Integer) width : (Long) width)); Object height = list.get(1); - pigeonResult.setHeight((height == null) ? null : ((height instanceof Integer) ? (Integer) height : (Long) height)); + pigeonResult.setHeight( + (height == null) + ? null + : ((height instanceof Integer) ? (Integer) height : (Long) height)); return pigeonResult; } } @@ -400,82 +401,19 @@ ArrayList toList() { static @NonNull ExposureCompensationRange fromList(@NonNull ArrayList list) { ExposureCompensationRange pigeonResult = new ExposureCompensationRange(); Object minCompensation = list.get(0); - pigeonResult.setMinCompensation((minCompensation == null) ? null : ((minCompensation instanceof Integer) ? (Integer) minCompensation : (Long) minCompensation)); + pigeonResult.setMinCompensation( + (minCompensation == null) + ? null + : ((minCompensation instanceof Integer) + ? (Integer) minCompensation + : (Long) minCompensation)); Object maxCompensation = list.get(1); - pigeonResult.setMaxCompensation((maxCompensation == null) ? null : ((maxCompensation instanceof Integer) ? (Integer) maxCompensation : (Long) maxCompensation)); - return pigeonResult; - } - } - - /** Generated class from Pigeon that represents data sent in messages. */ - public static final class ExposureCompensationRange { - private @NonNull Long minCompensation; - - public @NonNull Long getMinCompensation() { - return minCompensation; - } - - public void setMinCompensation(@NonNull Long setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"minCompensation\" is null."); - } - this.minCompensation = setterArg; - } - - private @NonNull Long maxCompensation; - - public @NonNull Long getMaxCompensation() { - return maxCompensation; - } - - public void setMaxCompensation(@NonNull Long setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"maxCompensation\" is null."); - } - this.maxCompensation = setterArg; - } - - /** Constructor is non-public to enforce null safety; use Builder. */ - ExposureCompensationRange() {} - - public static final class Builder { - - private @Nullable Long minCompensation; - - public @NonNull Builder setMinCompensation(@NonNull Long setterArg) { - this.minCompensation = setterArg; - return this; - } - - private @Nullable Long maxCompensation; - - public @NonNull Builder setMaxCompensation(@NonNull Long setterArg) { - this.maxCompensation = setterArg; - return this; - } - - public @NonNull ExposureCompensationRange build() { - ExposureCompensationRange pigeonReturn = new ExposureCompensationRange(); - pigeonReturn.setMinCompensation(minCompensation); - pigeonReturn.setMaxCompensation(maxCompensation); - return pigeonReturn; - } - } - - @NonNull - ArrayList toList() { - ArrayList toListResult = new ArrayList(2); - toListResult.add(minCompensation); - toListResult.add(maxCompensation); - return toListResult; - } - - static @NonNull ExposureCompensationRange fromList(@NonNull ArrayList list) { - ExposureCompensationRange pigeonResult = new ExposureCompensationRange(); - Object minCompensation = list.get(0); - pigeonResult.setMinCompensation((minCompensation == null) ? null : ((minCompensation instanceof Integer) ? (Integer) minCompensation : (Long) minCompensation)); - Object maxCompensation = list.get(1); - pigeonResult.setMaxCompensation((maxCompensation == null) ? null : ((maxCompensation instanceof Integer) ? (Integer) maxCompensation : (Long) maxCompensation)); + pigeonResult.setMaxCompensation( + (maxCompensation == null) + ? null + : ((maxCompensation instanceof Integer) + ? (Integer) maxCompensation + : (Long) maxCompensation)); return pigeonResult; } } @@ -491,7 +429,7 @@ public interface InstanceManagerHostApi { /** * Clear the native `InstanceManager`. * - * This is typically only used after a hot restart. + *

This is typically only used after a hot restart. */ void clear(); @@ -499,8 +437,12 @@ public interface InstanceManagerHostApi { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /**Sets up an instance of `InstanceManagerHostApi` to handle messages through the `binaryMessenger`. */ - static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable InstanceManagerHostApi api) { + /** + * Sets up an instance of `InstanceManagerHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setup( + @NonNull BinaryMessenger binaryMessenger, @Nullable InstanceManagerHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -512,8 +454,7 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable InstanceMa try { api.clear(); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -534,7 +475,9 @@ public interface JavaObjectHostApi { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /**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(@NonNull BinaryMessenger binaryMessenger, @Nullable JavaObjectHostApi api) { { BasicMessageChannel channel = @@ -549,8 +492,7 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable JavaObject try { api.dispose((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -570,7 +512,7 @@ public JavaObjectFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -579,6 +521,7 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } + public void dispose(@NonNull Long identifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -591,7 +534,7 @@ public void dispose(@NonNull Long identifierArg, @NonNull Reply callback) /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface CameraInfoHostApi { - @NonNull + @NonNull Long getSensorRotationDegrees(@NonNull Long identifier); @NonNull @@ -600,19 +543,23 @@ public interface CameraInfoHostApi { @NonNull Long getExposureState(@NonNull Long identifier); - @NonNull + @NonNull Long getZoomState(@NonNull Long identifier); /** The codec used by CameraInfoHostApi. */ static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /**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(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraInfoHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.CameraInfoHostApi.getSensorRotationDegrees", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -620,10 +567,11 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraInfo ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - Long output = api.getSensorRotationDegrees((identifierArg == null) ? null : identifierArg.longValue()); + Long output = + api.getSensorRotationDegrees( + (identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -671,34 +619,11 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraInfo ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - Long output = api.getLiveCameraState((identifierArg == null) ? null : identifierArg.longValue()); - wrapped.add(0, output); - } - catch (Throwable exception) { - ArrayList wrappedError = wrapError(exception); - wrapped = wrappedError; - } - reply.reply(wrapped); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.CameraInfoHostApi.getExposureState", getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - Number identifierArg = (Number) args.get(0); - try { - Long output = api.getExposureState((identifierArg == null) ? null : identifierArg.longValue()); + Long output = + api.getExposureState( + (identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -719,10 +644,10 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraInfo ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - Long output = api.getZoomState((identifierArg == null) ? null : identifierArg.longValue()); + Long output = + api.getZoomState((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -742,7 +667,7 @@ public CameraInfoFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -751,6 +676,7 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } + public void create(@NonNull Long identifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -765,15 +691,19 @@ public interface CameraSelectorHostApi { void create(@NonNull Long identifier, @Nullable Long lensFacing); - @NonNull + @NonNull List filter(@NonNull Long identifier, @NonNull List cameraInfoIds); /** The codec used by CameraSelectorHostApi. */ static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /**Sets up an instance of `CameraSelectorHostApi` to handle messages through the `binaryMessenger`. */ - static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraSelectorHostApi api) { + /** + * Sets up an instance of `CameraSelectorHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setup( + @NonNull BinaryMessenger binaryMessenger, @Nullable CameraSelectorHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -786,10 +716,11 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraSele Number identifierArg = (Number) args.get(0); Number lensFacingArg = (Number) args.get(1); try { - api.create((identifierArg == null) ? null : identifierArg.longValue(), (lensFacingArg == null) ? null : lensFacingArg.longValue()); + api.create( + (identifierArg == null) ? null : identifierArg.longValue(), + (lensFacingArg == null) ? null : lensFacingArg.longValue()); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -811,10 +742,12 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraSele Number identifierArg = (Number) args.get(0); List cameraInfoIdsArg = (List) args.get(1); try { - List output = api.filter((identifierArg == null) ? null : identifierArg.longValue(), cameraInfoIdsArg); + List output = + api.filter( + (identifierArg == null) ? null : identifierArg.longValue(), + cameraInfoIdsArg); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -834,7 +767,7 @@ public CameraSelectorFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -843,7 +776,9 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - public void create(@NonNull Long identifierArg, @Nullable Long lensFacingArg, @NonNull Reply callback) { + + public void create( + @NonNull Long identifierArg, @Nullable Long lensFacingArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.CameraSelectorFlutterApi.create", getCodec()); @@ -857,13 +792,16 @@ public interface ProcessCameraProviderHostApi { void getInstance(@NonNull Result result); - @NonNull + @NonNull List getAvailableCameraInfos(@NonNull Long identifier); - @NonNull - Long bindToLifecycle(@NonNull Long identifier, @NonNull Long cameraSelectorIdentifier, @NonNull List useCaseIds); + @NonNull + Long bindToLifecycle( + @NonNull Long identifier, + @NonNull Long cameraSelectorIdentifier, + @NonNull List useCaseIds); - @NonNull + @NonNull Boolean isBound(@NonNull Long identifier, @NonNull Long useCaseIdentifier); void unbind(@NonNull Long identifier, @NonNull List useCaseIds); @@ -874,12 +812,18 @@ public interface ProcessCameraProviderHostApi { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /**Sets up an instance of `ProcessCameraProviderHostApi` to handle messages through the `binaryMessenger`. */ - static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ProcessCameraProviderHostApi api) { + /** + * Sets up an instance of `ProcessCameraProviderHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setup( + @NonNull BinaryMessenger binaryMessenger, @Nullable ProcessCameraProviderHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -906,7 +850,9 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -914,10 +860,11 @@ public void error(Throwable error) { ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - List output = api.getAvailableCameraInfos((identifierArg == null) ? null : identifierArg.longValue()); + List output = + api.getAvailableCameraInfos( + (identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -930,7 +877,9 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.bindToLifecycle", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderHostApi.bindToLifecycle", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -940,10 +889,15 @@ public void error(Throwable error) { Number cameraSelectorIdentifierArg = (Number) args.get(1); List useCaseIdsArg = (List) args.get(2); try { - Long output = api.bindToLifecycle((identifierArg == null) ? null : identifierArg.longValue(), (cameraSelectorIdentifierArg == null) ? null : cameraSelectorIdentifierArg.longValue(), useCaseIdsArg); + Long output = + api.bindToLifecycle( + (identifierArg == null) ? null : identifierArg.longValue(), + (cameraSelectorIdentifierArg == null) + ? null + : cameraSelectorIdentifierArg.longValue(), + useCaseIdsArg); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -956,7 +910,9 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.isBound", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderHostApi.isBound", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -965,10 +921,12 @@ public void error(Throwable error) { Number identifierArg = (Number) args.get(0); Number useCaseIdentifierArg = (Number) args.get(1); try { - Boolean output = api.isBound((identifierArg == null) ? null : identifierArg.longValue(), (useCaseIdentifierArg == null) ? null : useCaseIdentifierArg.longValue()); + Boolean output = + api.isBound( + (identifierArg == null) ? null : identifierArg.longValue(), + (useCaseIdentifierArg == null) ? null : useCaseIdentifierArg.longValue()); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -981,7 +939,9 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.unbind", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderHostApi.unbind", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -990,10 +950,10 @@ public void error(Throwable error) { Number identifierArg = (Number) args.get(0); List useCaseIdsArg = (List) args.get(1); try { - api.unbind((identifierArg == null) ? null : identifierArg.longValue(), useCaseIdsArg); + api.unbind( + (identifierArg == null) ? null : identifierArg.longValue(), useCaseIdsArg); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1006,7 +966,9 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderHostApi.unbindAll", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderHostApi.unbindAll", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1016,8 +978,7 @@ public void error(Throwable error) { try { api.unbindAll((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1037,7 +998,7 @@ public ProcessCameraProviderFlutterApi(@NonNull BinaryMessenger argBinaryMesseng this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -1046,10 +1007,13 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } + public void create(@NonNull Long identifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create", + getCodec()); channel.send( new ArrayList(Collections.singletonList(identifierArg)), channelReply -> callback.reply(null)); @@ -1058,14 +1022,14 @@ public void create(@NonNull Long identifierArg, @NonNull Reply callback) { /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface CameraHostApi { - @NonNull + @NonNull Long getCameraInfo(@NonNull Long identifier); /** The codec used by CameraHostApi. */ static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /**Sets up an instance of `CameraHostApi` to handle messages through the `binaryMessenger`. */ + /** Sets up an instance of `CameraHostApi` to handle messages through the `binaryMessenger`. */ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraHostApi api) { { BasicMessageChannel channel = @@ -1078,10 +1042,10 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable CameraHost ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - Long output = api.getCameraInfo((identifierArg == null) ? null : identifierArg.longValue()); + Long output = + api.getCameraInfo((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1101,7 +1065,7 @@ public CameraFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -1110,6 +1074,7 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } + public void create(@NonNull Long identifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -1149,9 +1114,11 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface SystemServicesHostApi { - void requestCameraPermissions(@NonNull Boolean enableAudio, @NonNull Result result); + void requestCameraPermissions( + @NonNull Boolean enableAudio, @NonNull Result result); - void startListeningForDeviceOrientationChange(@NonNull Boolean isFrontFacing, @NonNull Long sensorOrientation); + void startListeningForDeviceOrientationChange( + @NonNull Boolean isFrontFacing, @NonNull Long sensorOrientation); void stopListeningForDeviceOrientationChange(); @@ -1162,12 +1129,18 @@ public interface SystemServicesHostApi { static @NonNull MessageCodec getCodec() { return SystemServicesHostApiCodec.INSTANCE; } - /**Sets up an instance of `SystemServicesHostApi` to handle messages through the `binaryMessenger`. */ - static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable SystemServicesHostApi api) { + /** + * Sets up an instance of `SystemServicesHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setup( + @NonNull BinaryMessenger binaryMessenger, @Nullable SystemServicesHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.SystemServicesHostApi.requestCameraPermissions", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.SystemServicesHostApi.requestCameraPermissions", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1196,7 +1169,9 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.SystemServicesHostApi.startListeningForDeviceOrientationChange", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.SystemServicesHostApi.startListeningForDeviceOrientationChange", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1205,10 +1180,11 @@ public void error(Throwable error) { Boolean isFrontFacingArg = (Boolean) args.get(0); Number sensorOrientationArg = (Number) args.get(1); try { - api.startListeningForDeviceOrientationChange(isFrontFacingArg, (sensorOrientationArg == null) ? null : sensorOrientationArg.longValue()); + api.startListeningForDeviceOrientationChange( + isFrontFacingArg, + (sensorOrientationArg == null) ? null : sensorOrientationArg.longValue()); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1221,7 +1197,9 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.SystemServicesHostApi.stopListeningForDeviceOrientationChange", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.SystemServicesHostApi.stopListeningForDeviceOrientationChange", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1229,8 +1207,7 @@ public void error(Throwable error) { try { api.stopListeningForDeviceOrientationChange(); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1276,7 +1253,7 @@ public SystemServicesFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -1285,18 +1262,25 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - public void onDeviceOrientationChanged(@NonNull String orientationArg, @NonNull Reply callback) { + + public void onDeviceOrientationChanged( + @NonNull String orientationArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.SystemServicesFlutterApi.onDeviceOrientationChanged", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.SystemServicesFlutterApi.onDeviceOrientationChanged", + getCodec()); channel.send( new ArrayList(Collections.singletonList(orientationArg)), channelReply -> callback.reply(null)); } + public void onCameraError(@NonNull String errorDescriptionArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.SystemServicesFlutterApi.onCameraError", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.SystemServicesFlutterApi.onCameraError", + getCodec()); channel.send( new ArrayList(Collections.singletonList(errorDescriptionArg)), channelReply -> callback.reply(null)); @@ -1337,21 +1321,24 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface PreviewHostApi { - void create(@NonNull Long identifier, @Nullable Long rotation, @Nullable ResolutionInfo targetResolution); + void create( + @NonNull Long identifier, + @Nullable Long rotation, + @Nullable ResolutionInfo targetResolution); - @NonNull + @NonNull Long setSurfaceProvider(@NonNull Long identifier); void releaseFlutterSurfaceTexture(); - @NonNull + @NonNull ResolutionInfo getResolutionInfo(@NonNull Long identifier); /** The codec used by PreviewHostApi. */ static @NonNull MessageCodec getCodec() { return PreviewHostApiCodec.INSTANCE; } - /**Sets up an instance of `PreviewHostApi` to handle messages through the `binaryMessenger`. */ + /** Sets up an instance of `PreviewHostApi` to handle messages through the `binaryMessenger`. */ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHostApi api) { { BasicMessageChannel channel = @@ -1366,10 +1353,12 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHos Number rotationArg = (Number) args.get(1); ResolutionInfo targetResolutionArg = (ResolutionInfo) args.get(2); try { - api.create((identifierArg == null) ? null : identifierArg.longValue(), (rotationArg == null) ? null : rotationArg.longValue(), targetResolutionArg); + api.create( + (identifierArg == null) ? null : identifierArg.longValue(), + (rotationArg == null) ? null : rotationArg.longValue(), + targetResolutionArg); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1382,7 +1371,9 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHos { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.PreviewHostApi.setSurfaceProvider", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.PreviewHostApi.setSurfaceProvider", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1390,10 +1381,11 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHos ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - Long output = api.setSurfaceProvider((identifierArg == null) ? null : identifierArg.longValue()); + Long output = + api.setSurfaceProvider( + (identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1406,7 +1398,9 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHos { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.PreviewHostApi.releaseFlutterSurfaceTexture", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.PreviewHostApi.releaseFlutterSurfaceTexture", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1414,8 +1408,7 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHos try { api.releaseFlutterSurfaceTexture(); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1436,10 +1429,11 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable PreviewHos ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - ResolutionInfo output = api.getResolutionInfo((identifierArg == null) ? null : identifierArg.longValue()); + ResolutionInfo output = + api.getResolutionInfo( + (identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1947,7 +1941,10 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface ImageCaptureHostApi { - void create(@NonNull Long identifier, @Nullable Long flashMode, @Nullable ResolutionInfo targetResolution); + void create( + @NonNull Long identifier, + @Nullable Long flashMode, + @Nullable ResolutionInfo targetResolution); void setFlashMode(@NonNull Long identifier, @NonNull Long flashMode); @@ -1957,7 +1954,10 @@ public interface ImageCaptureHostApi { static @NonNull MessageCodec getCodec() { return ImageCaptureHostApiCodec.INSTANCE; } - /**Sets up an instance of `ImageCaptureHostApi` to handle messages through the `binaryMessenger`. */ + /** + * Sets up an instance of `ImageCaptureHostApi` to handle messages through the + * `binaryMessenger`. + */ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageCaptureHostApi api) { { BasicMessageChannel channel = @@ -1972,10 +1972,12 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageCaptu Number flashModeArg = (Number) args.get(1); ResolutionInfo targetResolutionArg = (ResolutionInfo) args.get(2); try { - api.create((identifierArg == null) ? null : identifierArg.longValue(), (flashModeArg == null) ? null : flashModeArg.longValue(), targetResolutionArg); + api.create( + (identifierArg == null) ? null : identifierArg.longValue(), + (flashModeArg == null) ? null : flashModeArg.longValue(), + targetResolutionArg); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1997,10 +1999,11 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageCaptu Number identifierArg = (Number) args.get(0); Number flashModeArg = (Number) args.get(1); try { - api.setFlashMode((identifierArg == null) ? null : identifierArg.longValue(), (flashModeArg == null) ? null : flashModeArg.longValue()); + api.setFlashMode( + (identifierArg == null) ? null : identifierArg.longValue(), + (flashModeArg == null) ? null : flashModeArg.longValue()); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2033,7 +2036,8 @@ public void error(Throwable error) { } }; - api.takePicture((identifierArg == null) ? null : identifierArg.longValue(), resultCallback); + api.takePicture( + (identifierArg == null) ? null : identifierArg.longValue(), resultCallback); }); } else { channel.setMessageHandler(null); @@ -2134,7 +2138,7 @@ public ExposureStateFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -2143,91 +2147,19 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return ExposureStateFlutterApiCodec.INSTANCE; } - public void create(@NonNull Long identifierArg, @NonNull ExposureCompensationRange exposureCompensationRangeArg, @NonNull Double exposureCompensationStepArg, @NonNull Reply callback) { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ExposureStateFlutterApi.create", getCodec()); - channel.send( - new ArrayList(Arrays.asList(identifierArg, exposureCompensationRangeArg, exposureCompensationStepArg)), - channelReply -> callback.reply(null)); - } - } - /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ - public static class ZoomStateFlutterApi { - private final @NonNull BinaryMessenger binaryMessenger; - - public ZoomStateFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { - this.binaryMessenger = argBinaryMessenger; - } - - /** Public interface for sending reply. */ - @SuppressWarnings("UnknownNullness") - public interface Reply { - void reply(T reply); - } - /** The codec used by ZoomStateFlutterApi. */ - static @NonNull MessageCodec getCodec() { - return new StandardMessageCodec(); - } - public void create(@NonNull Long identifierArg, @NonNull Double minZoomRatioArg, @NonNull Double maxZoomRatioArg, @NonNull Reply callback) { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ZoomStateFlutterApi.create", getCodec()); - channel.send( - new ArrayList(Arrays.asList(identifierArg, minZoomRatioArg, maxZoomRatioArg)), - channelReply -> callback.reply(null)); - } - } - - private static class ExposureStateFlutterApiCodec extends StandardMessageCodec { - public static final ExposureStateFlutterApiCodec INSTANCE = new ExposureStateFlutterApiCodec(); - - private ExposureStateFlutterApiCodec() {} - - @Override - protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { - switch (type) { - case (byte) 128: - return ExposureCompensationRange.fromList((ArrayList) readValue(buffer)); - default: - return super.readValueOfType(type, buffer); - } - } - - @Override - protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { - if (value instanceof ExposureCompensationRange) { - stream.write(128); - writeValue(stream, ((ExposureCompensationRange) value).toList()); - } else { - super.writeValue(stream, value); - } - } - } - /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ - public static class ExposureStateFlutterApi { - private final @NonNull BinaryMessenger binaryMessenger; - - public ExposureStateFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { - this.binaryMessenger = argBinaryMessenger; - } - - /** Public interface for sending reply. */ - @SuppressWarnings("UnknownNullness") - public interface Reply { - void reply(T reply); - } - /** The codec used by ExposureStateFlutterApi. */ - static @NonNull MessageCodec getCodec() { - return ExposureStateFlutterApiCodec.INSTANCE; - } - public void create(@NonNull Long identifierArg, @NonNull ExposureCompensationRange exposureCompensationRangeArg, @NonNull Double exposureCompensationStepArg, @NonNull Reply callback) { + public void create( + @NonNull Long identifierArg, + @NonNull ExposureCompensationRange exposureCompensationRangeArg, + @NonNull Double exposureCompensationStepArg, + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.ExposureStateFlutterApi.create", getCodec()); channel.send( - new ArrayList(Arrays.asList(identifierArg, exposureCompensationRangeArg, exposureCompensationStepArg)), + new ArrayList( + Arrays.asList( + identifierArg, exposureCompensationRangeArg, exposureCompensationStepArg)), channelReply -> callback.reply(null)); } } @@ -2239,7 +2171,7 @@ public ZoomStateFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -2248,7 +2180,12 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - public void create(@NonNull Long identifierArg, @NonNull Double minZoomRatioArg, @NonNull Double maxZoomRatioArg, @NonNull Reply callback) { + + public void create( + @NonNull Long identifierArg, + @NonNull Double minZoomRatioArg, + @NonNull Double maxZoomRatioArg, + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.ZoomStateFlutterApi.create", getCodec()); @@ -2297,8 +2234,12 @@ public interface ImageAnalysisHostApi { static @NonNull MessageCodec getCodec() { return ImageAnalysisHostApiCodec.INSTANCE; } - /**Sets up an instance of `ImageAnalysisHostApi` to handle messages through the `binaryMessenger`. */ - static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageAnalysisHostApi api) { + /** + * Sets up an instance of `ImageAnalysisHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setup( + @NonNull BinaryMessenger binaryMessenger, @Nullable ImageAnalysisHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -2311,10 +2252,11 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageAnaly Number identifierArg = (Number) args.get(0); ResolutionInfo targetResolutionIdentifierArg = (ResolutionInfo) args.get(1); try { - api.create((identifierArg == null) ? null : identifierArg.longValue(), targetResolutionIdentifierArg); + api.create( + (identifierArg == null) ? null : identifierArg.longValue(), + targetResolutionIdentifierArg); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2336,10 +2278,11 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageAnaly Number identifierArg = (Number) args.get(0); Number analyzerIdentifierArg = (Number) args.get(1); try { - api.setAnalyzer((identifierArg == null) ? null : identifierArg.longValue(), (analyzerIdentifierArg == null) ? null : analyzerIdentifierArg.longValue()); + api.setAnalyzer( + (identifierArg == null) ? null : identifierArg.longValue(), + (analyzerIdentifierArg == null) ? null : analyzerIdentifierArg.longValue()); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2352,7 +2295,9 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageAnaly { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.ImageAnalysisHostApi.clearAnalyzer", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.ImageAnalysisHostApi.clearAnalyzer", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -2362,8 +2307,7 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageAnaly try { api.clearAnalyzer((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2384,7 +2328,9 @@ public interface AnalyzerHostApi { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /**Sets up an instance of `AnalyzerHostApi` to handle messages through the `binaryMessenger`. */ + /** + * Sets up an instance of `AnalyzerHostApi` to handle messages through the `binaryMessenger`. + */ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable AnalyzerHostApi api) { { BasicMessageChannel channel = @@ -2399,8 +2345,7 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable AnalyzerHo try { api.create((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2695,7 +2640,7 @@ public AnalyzerFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -2704,6 +2649,7 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } + public void create(@NonNull Long identifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -2712,7 +2658,11 @@ public void create(@NonNull Long identifierArg, @NonNull Reply callback) { new ArrayList(Collections.singletonList(identifierArg)), channelReply -> callback.reply(null)); } - public void analyze(@NonNull Long identifierArg, @NonNull Long imageProxyIdentifierArg, @NonNull Reply callback) { + + public void analyze( + @NonNull Long identifierArg, + @NonNull Long imageProxyIdentifierArg, + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.AnalyzerFlutterApi.analyze", getCodec()); @@ -2724,7 +2674,7 @@ public void analyze(@NonNull Long identifierArg, @NonNull Long imageProxyIdentif /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface ImageProxyHostApi { - @NonNull + @NonNull List getPlanes(@NonNull Long identifier); void close(@NonNull Long identifier); @@ -2733,7 +2683,9 @@ public interface ImageProxyHostApi { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - /**Sets up an instance of `ImageProxyHostApi` to handle messages through the `binaryMessenger`. */ + /** + * Sets up an instance of `ImageProxyHostApi` to handle messages through the `binaryMessenger`. + */ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageProxyHostApi api) { { BasicMessageChannel channel = @@ -2746,10 +2698,10 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageProxy ArrayList args = (ArrayList) message; Number identifierArg = (Number) args.get(0); try { - List output = api.getPlanes((identifierArg == null) ? null : identifierArg.longValue()); + List output = + api.getPlanes((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2772,8 +2724,7 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable ImageProxy try { api.close((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2793,7 +2744,7 @@ public ImageProxyFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -2802,7 +2753,13 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - public void create(@NonNull Long identifierArg, @NonNull Long formatArg, @NonNull Long heightArg, @NonNull Long widthArg, @NonNull Reply callback) { + + public void create( + @NonNull Long identifierArg, + @NonNull Long formatArg, + @NonNull Long heightArg, + @NonNull Long widthArg, + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.ImageProxyFlutterApi.create", getCodec()); @@ -2819,7 +2776,7 @@ public PlaneProxyFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ + /** Public interface for sending reply. */ @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); @@ -2828,12 +2785,19 @@ public interface Reply { static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - public void create(@NonNull Long identifierArg, @NonNull byte[] bufferArg, @NonNull Long pixelStrideArg, @NonNull Long rowStrideArg, @NonNull Reply callback) { + + public void create( + @NonNull Long identifierArg, + @NonNull byte[] bufferArg, + @NonNull Long pixelStrideArg, + @NonNull Long rowStrideArg, + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.PlaneProxyFlutterApi.create", getCodec()); channel.send( - new ArrayList(Arrays.asList(identifierArg, bufferArg, pixelStrideArg, rowStrideArg)), + new ArrayList( + Arrays.asList(identifierArg, bufferArg, pixelStrideArg, rowStrideArg)), channelReply -> callback.reply(null)); } } diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart index 1f3a4d632ceb..959f35b0980e 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart @@ -412,55 +412,6 @@ class AndroidCameraCameraX extends CameraPlatform { return zoomState.minZoomRatio; } - /// Gets the minimum supported exposure offset for the selected camera in EV units. - /// - /// [cameraId] not used. - @override - Future getMinExposureOffset(int cameraId) async { - final ExposureState exposureState = await cameraInfo!.getExposureState(); - return exposureState.exposureCompensationRange.minCompensation * - exposureState.exposureCompensationStep; - } - - /// Gets the maximum supported exposure offset for the selected camera in EV units. - /// - /// [cameraId] not used. - @override - Future getMaxExposureOffset(int cameraId) async { - final ExposureState exposureState = await cameraInfo!.getExposureState(); - return exposureState.exposureCompensationRange.maxCompensation * - exposureState.exposureCompensationStep; - } - - /// Gets the supported step size for exposure offset for the selected camera in EV units. - /// - /// Returns 0 when exposure compensation is not supported. - /// - /// [cameraId] not used. - @override - Future getExposureOffsetStepSize(int cameraId) async { - final ExposureState exposureState = await cameraInfo!.getExposureState(); - return exposureState.exposureCompensationStep; - } - - /// Gets the maximum supported zoom level for the selected camera. - /// - /// [cameraId] not used. - @override - Future getMaxZoomLevel(int cameraId) async { - final ZoomState exposureState = await cameraInfo!.getZoomState(); - return exposureState.maxZoomRatio; - } - - /// Gets the minimum supported zoom level for the selected camera. - /// - /// [cameraId] not used. - @override - Future getMinZoomLevel(int cameraId) async { - final ZoomState exposureState = await cameraInfo!.getZoomState(); - return exposureState.minZoomRatio; - } - /// The ui orientation changed. @override Stream onDeviceOrientationChanged() { 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 e60fbdec5197..b268323ccfe2 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 @@ -144,12 +144,6 @@ class AndroidCameraXCameraFlutterApis { /// Flutter Api for [ZoomState]. late final ZoomStateFlutterApiImpl zoomStateFlutterApiImpl; - /// Flutter Api for [ExposureState]. - late final ExposureStateFlutterApiImpl exposureStateFlutterApiImpl; - - /// Flutter Api for [ZoomState]. - late final ZoomStateFlutterApiImpl zoomStateFlutterApiImpl; - /// Flutter Api implementation for [Analyzer]. late final AnalyzerFlutterApiImpl analyzerFlutterApiImpl; 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 48c03e675bb5..4ed78ddfbf37 100644 --- a/packages/camera/camera_android_camerax/lib/src/camera_info.dart +++ b/packages/camera/camera_android_camerax/lib/src/camera_info.dart @@ -98,23 +98,6 @@ class _CameraInfoHostApiImpl extends CameraInfoHostApi { return instanceManager.getInstanceWithWeakReference>( zoomStateIdentifier)!; } - - /// Gets the [ExposureState] of the specified [CameraInfo] instance. - Future getExposureStateFromInstance( - CameraInfo instance) async { - final int? identifier = instanceManager.getIdentifier(instance); - final int exposureStateIdentifier = await getExposureState(identifier!); - return instanceManager - .getInstanceWithWeakReference(exposureStateIdentifier)!; - } - - /// Gets the [ZoomState] of the specified [CameraInfo] instance. - Future getZoomStateFromInstance(CameraInfo instance) async { - final int? identifier = instanceManager.getIdentifier(instance); - final int zoomStateIdentifier = await getZoomState(identifier!); - return instanceManager - .getInstanceWithWeakReference(zoomStateIdentifier)!; - } } /// Flutter API implementation of [CameraInfo]. diff --git a/packages/camera/camera_android_camerax/lib/src/camerax_library.g.dart b/packages/camera/camera_android_camerax/lib/src/camerax_library.g.dart index a1546ccf3730..2a1b2813f1aa 100644 --- a/packages/camera/camera_android_camerax/lib/src/camerax_library.g.dart +++ b/packages/camera/camera_android_camerax/lib/src/camerax_library.g.dart @@ -147,32 +147,6 @@ class ExposureCompensationRange { } } -class ExposureCompensationRange { - ExposureCompensationRange({ - required this.minCompensation, - required this.maxCompensation, - }); - - int minCompensation; - - int maxCompensation; - - Object encode() { - return [ - minCompensation, - maxCompensation, - ]; - } - - static ExposureCompensationRange decode(Object result) { - result as List; - return ExposureCompensationRange( - minCompensation: result[0]! as int, - maxCompensation: result[1]! as int, - ); - } -} - class InstanceManagerHostApi { /// Constructor for [InstanceManagerHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default @@ -1793,104 +1767,6 @@ abstract class ZoomStateFlutterApi { } } -class _ExposureStateFlutterApiCodec extends StandardMessageCodec { - const _ExposureStateFlutterApiCodec(); - @override - void writeValue(WriteBuffer buffer, Object? value) { - if (value is ExposureCompensationRange) { - buffer.putUint8(128); - writeValue(buffer, value.encode()); - } else { - super.writeValue(buffer, value); - } - } - - @override - Object? readValueOfType(int type, ReadBuffer buffer) { - switch (type) { - case 128: - return ExposureCompensationRange.decode(readValue(buffer)!); - default: - return super.readValueOfType(type, buffer); - } - } -} - -abstract class ExposureStateFlutterApi { - static const MessageCodec codec = _ExposureStateFlutterApiCodec(); - - void create( - int identifier, - ExposureCompensationRange exposureCompensationRange, - double exposureCompensationStep); - - static void setup(ExposureStateFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { - { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ExposureStateFlutterApi.create', codec, - binaryMessenger: binaryMessenger); - if (api == null) { - channel.setMessageHandler(null); - } else { - channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.ExposureStateFlutterApi.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.ExposureStateFlutterApi.create was null, expected non-null int.'); - final ExposureCompensationRange? arg_exposureCompensationRange = - (args[1] as ExposureCompensationRange?); - assert(arg_exposureCompensationRange != null, - 'Argument for dev.flutter.pigeon.ExposureStateFlutterApi.create was null, expected non-null ExposureCompensationRange.'); - final double? arg_exposureCompensationStep = (args[2] as double?); - assert(arg_exposureCompensationStep != null, - 'Argument for dev.flutter.pigeon.ExposureStateFlutterApi.create was null, expected non-null double.'); - api.create(arg_identifier!, arg_exposureCompensationRange!, - arg_exposureCompensationStep!); - return; - }); - } - } - } -} - -abstract class ZoomStateFlutterApi { - static const MessageCodec codec = StandardMessageCodec(); - - void create(int identifier, double minZoomRatio, double maxZoomRatio); - - static void setup(ZoomStateFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { - { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ZoomStateFlutterApi.create', codec, - binaryMessenger: binaryMessenger); - if (api == null) { - channel.setMessageHandler(null); - } else { - channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.ZoomStateFlutterApi.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.ZoomStateFlutterApi.create was null, expected non-null int.'); - final double? arg_minZoomRatio = (args[1] as double?); - assert(arg_minZoomRatio != null, - 'Argument for dev.flutter.pigeon.ZoomStateFlutterApi.create was null, expected non-null double.'); - final double? arg_maxZoomRatio = (args[2] as double?); - assert(arg_maxZoomRatio != null, - 'Argument for dev.flutter.pigeon.ZoomStateFlutterApi.create was null, expected non-null double.'); - api.create(arg_identifier!, arg_minZoomRatio!, arg_maxZoomRatio!); - return; - }); - } - } - } -} - class _ImageAnalysisHostApiCodec extends StandardMessageCodec { const _ImageAnalysisHostApiCodec(); @override diff --git a/packages/camera/camera_android_camerax/pigeons/camerax_library.dart b/packages/camera/camera_android_camerax/pigeons/camerax_library.dart index ac14add39ace..601601dbf365 100644 --- a/packages/camera/camera_android_camerax/pigeons/camerax_library.dart +++ b/packages/camera/camera_android_camerax/pigeons/camerax_library.dart @@ -96,16 +96,6 @@ class ExposureCompensationRange { int maxCompensation; } -class ExposureCompensationRange { - ExposureCompensationRange({ - required this.minCompensation, - required this.maxCompensation, - }); - - int minCompensation; - int maxCompensation; -} - @HostApi(dartHostTestHandler: 'TestInstanceManagerHostApi') abstract class InstanceManagerHostApi { /// Clear the native `InstanceManager`. @@ -297,19 +287,6 @@ abstract class ZoomStateFlutterApi { void create(int identifier, double minZoomRatio, double maxZoomRatio); } -@FlutterApi() -abstract class ExposureStateFlutterApi { - void create( - int identifier, - ExposureCompensationRange exposureCompensationRange, - double exposureCompensationStep); -} - -@FlutterApi() -abstract class ZoomStateFlutterApi { - void create(int identifier, double minZoomRatio, double maxZoomRatio); -} - @HostApi(dartHostTestHandler: 'TestImageAnalysisHostApi') abstract class ImageAnalysisHostApi { void create(int identifier, ResolutionInfo? targetResolutionIdentifier); diff --git a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart index 88b381fc4143..d6e2531cf084 100644 --- a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart +++ b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart @@ -181,8 +181,6 @@ void main() { final MockCameraInfo mockCameraInfo = MockCameraInfo(); final MockLiveCameraState mockLiveCameraState = MockLiveCameraState(); - camera.processCameraProvider = mockProcessCameraProvider; - when(camera.testPreview.setSurfaceProvider()) .thenAnswer((_) async => testSurfaceTextureId); when(mockProcessCameraProvider.bindToLifecycle( @@ -247,16 +245,6 @@ void main() { final MockCamera mockCamera = MockCamera(); final MockCameraInfo mockCameraInfo = MockCameraInfo(); - when(mockProcessCameraProvider.bindToLifecycle( - camera.mockBackCameraSelector, - [camera.testPreview, camera.testImageCapture])) - .thenAnswer((_) async => mockCamera); - when(mockCamera.getCameraInfo()).thenAnswer((_) async => mockCameraInfo); - when(mockCameraInfo.getLiveCameraState()) - .thenAnswer((_) async => MockLiveData()); - camera.processCameraProvider = mockProcessCameraProvider; - camera.createDetachedObjectForTesting = true; - camera.processCameraProvider = mockProcessCameraProvider; when(mockProcessCameraProvider.bindToLifecycle( @@ -340,16 +328,6 @@ void main() { await camera.createCamera(testCameraDescription, testResolutionPreset, enableAudio: enableAudio); - when(mockProcessCameraProvider.bindToLifecycle(any, any)) - .thenAnswer((_) async => mockCamera); - when(mockCamera.getCameraInfo()) - .thenAnswer((_) => Future.value(MockCameraInfo())); - when(camera.testPreview.getResolutionInfo()) - .thenAnswer((_) async => testResolutionInfo); - - await camera.createCamera(testCameraDescription, testResolutionPreset, - enableAudio: enableAudio); - // Start listening to camera events stream to verify the proper CameraInitializedEvent is sent. camera.cameraEventStreamController.stream.listen((CameraEvent event) { expect(event, const TypeMatcher()); @@ -537,11 +515,6 @@ void main() { when(mockCameraInfo.getCameraState()) .thenAnswer((_) async => mockLiveCameraState); - when(mockProcessCameraProvider.bindToLifecycle(any, any)) - .thenAnswer((_) => Future.value(mockCamera)); - when(mockCamera.getCameraInfo()) - .thenAnswer((_) => Future.value(mockCameraInfo)); - await camera.resumePreview(78); verify(camera.processCameraProvider! @@ -578,11 +551,6 @@ void main() { when(mockCameraInfo.getCameraState()) .thenAnswer((_) async => MockLiveCameraState()); - when(mockProcessCameraProvider.bindToLifecycle(any, any)) - .thenAnswer((_) => Future.value(mockCamera)); - when(mockCamera.getCameraInfo()) - .thenAnswer((_) => Future.value(MockCameraInfo())); - final FutureBuilder previewWidget = camera.buildPreview(textureId) as FutureBuilder; @@ -622,11 +590,6 @@ void main() { when(mockCameraInfo.getCameraState()) .thenAnswer((_) async => MockLiveCameraState()); - when(mockProcessCameraProvider.bindToLifecycle(any, any)) - .thenAnswer((_) => Future.value(mockCamera)); - when(mockCamera.getCameraInfo()) - .thenAnswer((_) => Future.value(mockCameraInfo)); - final FutureBuilder previewWidget = camera.buildPreview(textureId) as FutureBuilder; @@ -929,11 +892,6 @@ void main() { camera.processCameraProvider = mockProcessCameraProvider; camera.cameraSelector = MockCameraSelector(); - when(mockProcessCameraProvider.bindToLifecycle(any, any)) - .thenAnswer((_) => Future.value(mockCamera)); - when(mockCamera.getCameraInfo()) - .thenAnswer((_) => Future.value(MockCameraInfo())); - when(mockProcessCameraProvider.bindToLifecycle(any, any)) .thenAnswer((_) => Future.value(mockCamera)); when(mockCamera.getCameraInfo()) From 8de6de1b5c044ca0f06be85ccb4c40e5351de9c8 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 27 Jun 2023 14:47:03 -0700 Subject: [PATCH 03/28] Make fixes --- .../io/flutter/plugins/camera/Camera.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java index bb0aff80841d..88a69bf4b70a 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -21,6 +21,7 @@ import android.hardware.camera2.params.SessionConfiguration; import android.media.CamcorderProfile; import android.media.EncoderProfiles; +import android.media.Image; import android.media.ImageReader; import android.media.MediaRecorder; import android.os.Build; @@ -414,8 +415,13 @@ private void createCaptureSession( List remainingSurfaces = Arrays.asList(surfaces); if (templateType != CameraDevice.TEMPLATE_PREVIEW) { - // If it is not preview mode, add all surfaces as targets. + // If it is not preview mode, add all surfaces as targets + // except the surface used for still capture as this should + // not be part of a repeating request. for (Surface surface : remainingSurfaces) { + if (surface == pictureImageReader.getSurface()) { + continue; + } previewRequestBuilder.addTarget(surface); } } @@ -539,6 +545,10 @@ private void startCapture(boolean record, boolean stream) throws CameraAccessExc surfaces.add(imageStreamReader.getSurface()); } + // Add pictureImageReader surface to allow for still capture + // during recording/image streaming. + surfaces.add(pictureImageReader.getSurface()); + createCaptureSession( CameraDevice.TEMPLATE_RECORD, successCallback, surfaces.toArray(new Surface[0])); } @@ -659,7 +669,6 @@ public void onCaptureCompleted( }; try { - captureSession.stopRepeating(); Log.i(TAG, "sending capture request"); captureSession.capture(stillBuilder.build(), captureCallback, backgroundHandler); } catch (CameraAccessException e) { @@ -1140,10 +1149,15 @@ public void startPreviewWithImageStream(EventChannel imageStreamChannel) public void onImageAvailable(ImageReader reader) { Log.i(TAG, "onImageAvailable"); + // Use acquireNextImage since image reader is only for one image. + Image image = reader.acquireNextImage(); + if (image == null) { + return; + } + backgroundHandler.post( new ImageSaver( - // Use acquireNextImage since image reader is only for one image. - reader.acquireNextImage(), + image, captureFile, new ImageSaver.Callback() { @Override From 0710eb813bee6f35f73bfc5ca0649003557321f8 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 27 Jun 2023 15:43:49 -0700 Subject: [PATCH 04/28] Initial stab at tests --- .../io/flutter/plugins/camera/Camera.java | 2 + .../io/flutter/plugins/camera/CameraTest.java | 104 ++++++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java index 88a69bf4b70a..8236ee574905 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -419,9 +419,11 @@ private void createCaptureSession( // except the surface used for still capture as this should // not be part of a repeating request. for (Surface surface : remainingSurfaces) { + Log.e("CAMILLE", "OK 1"); if (surface == pictureImageReader.getSurface()) { continue; } + Log.e("CAMILLE", "OK 2"); previewRequestBuilder.addTarget(surface); } } diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 9de33e3dc7a8..2846df74fcec 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -8,6 +8,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; @@ -36,6 +37,7 @@ import androidx.annotation.Nullable; import androidx.lifecycle.LifecycleObserver; import io.flutter.embedding.engine.systemchannels.PlatformChannel; +import io.flutter.plugin.common.EventChannel; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugins.camera.features.CameraFeatureFactory; import io.flutter.plugins.camera.features.CameraFeatures; @@ -56,6 +58,7 @@ import io.flutter.plugins.camera.features.sensororientation.DeviceOrientationManager; import io.flutter.plugins.camera.features.sensororientation.SensorOrientationFeature; import io.flutter.plugins.camera.features.zoomlevel.ZoomLevelFeature; +import io.flutter.plugins.camera.media.ImageStreamReader; import io.flutter.plugins.camera.utils.TestUtils; import io.flutter.view.TextureRegistry; import java.util.ArrayList; @@ -707,6 +710,37 @@ public void startPreview_shouldFlipRotation() throws InterruptedException, Camer verify(mockVideoRenderer, times(1)).setRotation(180); } + @Test + public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() + throws InterruptedException, CameraAccessException { + ArrayList mockRequestBuilders = new ArrayList<>(); + mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); + Size mockSize = mock(Size.class); + ImageReader mockPictureImageReader = mock(ImageReader.class); + ImageStreamReader mockImageStreamReader = mock(ImageStreamReader.class); + TestUtils.setPrivateField(camera, "recordingVideo", false); + TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); + CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); + TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + camera.imageStreamReader = mockImageStreamReader; + + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = + (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); + ResolutionFeature resolutionFeature = + (ResolutionFeature) + TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); + when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); + + camera.startPreviewWithImageStream(mock(EventChannel.class)); + verify(mockImageStreamReader, times(1)) + .getSurface(); // stream pulled from image streaming imageReader's surface. + verify(mockPictureImageReader, times(1)) + .getSurface(); // stream pulled from regular imageReader's surface. + } + @Test public void setDescriptionWhileRecording_shouldErrorWhenNotRecording() { MethodChannel.Result mockResult = mock(MethodChannel.Result.class); @@ -806,6 +840,37 @@ public void setFocusMode_shouldSendErrorEventOnUnlockAutoFocusCameraAccessExcept verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); } + @Test + public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader() + throws InterruptedException, CameraAccessException { + ArrayList mockRequestBuilders = new ArrayList<>(); + mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); + Size mockSize = mock(Size.class); + MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); + ImageReader mockPictureImageReader = mock(ImageReader.class); + TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); + TestUtils.setPrivateField(camera, "recordingVideo", false); + TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); + CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); + TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = + (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); + ResolutionFeature resolutionFeature = + (ResolutionFeature) + TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); + when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); + + camera.startVideoRecording(mock(MethodChannel.Result.class), mock(EventChannel.class)); + verify(mockMediaRecorder, times(1)) + .getSurface(); // stream pulled from media recorder's surface. + verify(mockPictureImageReader, times(1)) + .getSurface(); // stream pulled from image streaming imageReader's surface. + } + @Test public void setFocusMode_shouldLockAutoFocusForLockedMode() throws CameraAccessException { camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); @@ -1013,6 +1078,45 @@ public void createCaptureSession_doesNotCloseCaptureSession() throws CameraAcces verify(mockCaptureSession, never()).close(); } + @Test + public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest() + throws CameraAccessException { + Surface mockSurface = mock(Surface.class); + Surface mockSecondarySurface = mock(Surface.class); + SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); + ResolutionFeature mockResolutionFeature = mock(ResolutionFeature.class); + Size mockSize = mock(Size.class); + ArrayList mockRequestBuilders = new ArrayList<>(); + mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); + ImageReader mockPictureImageReader = mock(ImageReader.class); + TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); + CaptureRequest.Builder mockPreviewRequestBuilder = mock(CaptureRequest.Builder.class); + + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = + (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); + CameraFeatures cameraFeatures = + (CameraFeatures) TestUtils.getPrivateField(camera, "cameraFeatures"); + ResolutionFeature resolutionFeature = + (ResolutionFeature) + TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); + when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); + when(fakeCamera.createCaptureRequest(anyInt())).thenReturn(mockPreviewRequestBuilder); + when(mockPictureImageReader.getSurface()).thenReturn(mockSurface); + + // Test with preview template, which should exclude any other surface. + camera.createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, mockSurface, mockSecondarySurface); + verify(mockPreviewRequestBuilder, times(0)).addTarget(any(Surface.class)); + + // Test with non-preview template. + camera.createCaptureSession(CameraDevice.TEMPLATE_RECORD, mockSurface, mockSecondarySurface); + verify(mockPreviewRequestBuilder, times(0)).addTarget(mockSurface); + verify(mockPreviewRequestBuilder).addTarget(mockSecondarySurface); + } + @Test public void close_doesCloseCaptureSessionWhenCameraDeviceNull() { camera.close(); From 72365fac7c5e75c40c2fc472180d226d4c3211af Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 27 Jun 2023 16:02:33 -0700 Subject: [PATCH 05/28] Test attmept 2 --- .../java/io/flutter/plugins/camera/CameraTest.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 2846df74fcec..157582e99eb6 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -8,7 +8,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; @@ -641,6 +640,8 @@ public void startPreview_shouldPullStreamFromVideoRenderer() TestUtils.setPrivateField(camera, "videoRenderer", mockVideoRenderer); CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + ImageReader mockPictureImageReader = mock(ImageReader.class); + TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); @@ -668,6 +669,8 @@ public void startPreview_shouldPullStreamFromImageReader() TestUtils.setPrivateField(camera, "pictureImageReader", mockImageReader); CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + ImageReader mockPictureImageReader = mock(ImageReader.class); + TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); @@ -677,6 +680,7 @@ public void startPreview_shouldPullStreamFromImageReader() when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); + when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); verify(mockImageReader, times(1)) @@ -737,7 +741,7 @@ public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() camera.startPreviewWithImageStream(mock(EventChannel.class)); verify(mockImageStreamReader, times(1)) .getSurface(); // stream pulled from image streaming imageReader's surface. - verify(mockPictureImageReader, times(1)) + verify(mockPictureImageReader, times(2)) .getSurface(); // stream pulled from regular imageReader's surface. } @@ -863,6 +867,7 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); + when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startVideoRecording(mock(MethodChannel.Result.class), mock(EventChannel.class)); verify(mockMediaRecorder, times(1)) @@ -1104,7 +1109,7 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); - when(fakeCamera.createCaptureRequest(anyInt())).thenReturn(mockPreviewRequestBuilder); + when(fakeCamera.createCaptureRequest(any())).thenReturn(mockPreviewRequestBuilder); when(mockPictureImageReader.getSurface()).thenReturn(mockSurface); // Test with preview template, which should exclude any other surface. From 4bb3601ee70484ad0cdfc94763bea117fa1cecaa Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 27 Jun 2023 16:24:45 -0700 Subject: [PATCH 06/28] some test fixes --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 2 -- .../test/java/io/flutter/plugins/camera/CameraTest.java | 8 +++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java index 8236ee574905..88a69bf4b70a 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -419,11 +419,9 @@ private void createCaptureSession( // except the surface used for still capture as this should // not be part of a repeating request. for (Surface surface : remainingSurfaces) { - Log.e("CAMILLE", "OK 1"); if (surface == pictureImageReader.getSurface()) { continue; } - Log.e("CAMILLE", "OK 2"); previewRequestBuilder.addTarget(surface); } } diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 157582e99eb6..b8740f60d1fb 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -669,8 +669,6 @@ public void startPreview_shouldPullStreamFromImageReader() TestUtils.setPrivateField(camera, "pictureImageReader", mockImageReader); CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); - ImageReader mockPictureImageReader = mock(ImageReader.class); - TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); @@ -680,7 +678,7 @@ public void startPreview_shouldPullStreamFromImageReader() when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); - when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); + when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); verify(mockImageReader, times(1)) @@ -699,6 +697,8 @@ public void startPreview_shouldFlipRotation() throws InterruptedException, Camer TestUtils.setPrivateField(camera, "initialCameraFacing", CameraMetadata.LENS_FACING_BACK); CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + ImageReader mockPictureImageReader = mock(ImageReader.class); + TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); @@ -709,6 +709,7 @@ public void startPreview_shouldFlipRotation() throws InterruptedException, Camer when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(mockCameraProperties.getLensFacing()).thenReturn(CameraMetadata.LENS_FACING_FRONT); + when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); verify(mockVideoRenderer, times(1)).setRotation(180); @@ -867,6 +868,7 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); + when(mockMediaRecorder.getSurface()).thenReturn(mock(Surface.class)); when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startVideoRecording(mock(MethodChannel.Result.class), mock(EventChannel.class)); From 7a456214666cf00140e02948fd4589cb355b44ee Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 27 Jun 2023 16:44:22 -0700 Subject: [PATCH 07/28] Test changes, removed test for ease --- .../io/flutter/plugins/camera/CameraTest.java | 1609 ++++++++--------- 1 file changed, 798 insertions(+), 811 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index b8740f60d1fb..951201b60f79 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -4,15 +4,9 @@ package io.flutter.plugins.camera; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -34,27 +28,20 @@ import android.view.Surface; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.lifecycle.LifecycleObserver; -import io.flutter.embedding.engine.systemchannels.PlatformChannel; import io.flutter.plugin.common.EventChannel; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugins.camera.features.CameraFeatureFactory; import io.flutter.plugins.camera.features.CameraFeatures; -import io.flutter.plugins.camera.features.Point; import io.flutter.plugins.camera.features.autofocus.AutoFocusFeature; -import io.flutter.plugins.camera.features.autofocus.FocusMode; import io.flutter.plugins.camera.features.exposurelock.ExposureLockFeature; -import io.flutter.plugins.camera.features.exposurelock.ExposureMode; import io.flutter.plugins.camera.features.exposureoffset.ExposureOffsetFeature; import io.flutter.plugins.camera.features.exposurepoint.ExposurePointFeature; import io.flutter.plugins.camera.features.flash.FlashFeature; -import io.flutter.plugins.camera.features.flash.FlashMode; import io.flutter.plugins.camera.features.focuspoint.FocusPointFeature; import io.flutter.plugins.camera.features.fpsrange.FpsRangeFeature; import io.flutter.plugins.camera.features.noisereduction.NoiseReductionFeature; import io.flutter.plugins.camera.features.resolution.ResolutionFeature; import io.flutter.plugins.camera.features.resolution.ResolutionPreset; -import io.flutter.plugins.camera.features.sensororientation.DeviceOrientationManager; import io.flutter.plugins.camera.features.sensororientation.SensorOrientationFeature; import io.flutter.plugins.camera.features.zoomlevel.ZoomLevelFeature; import io.flutter.plugins.camera.media.ImageStreamReader; @@ -151,482 +138,482 @@ public void after() { mockHandlerFactory.close(); } - @Test - public void shouldNotImplementLifecycleObserverInterface() { - Class cameraClass = Camera.class; - - assertFalse(LifecycleObserver.class.isAssignableFrom(cameraClass)); - } - - @Test - public void shouldCreateCameraPluginAndSetAllFeatures() { - final Activity mockActivity = mock(Activity.class); - final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = - mock(TextureRegistry.SurfaceTextureEntry.class); - final CameraFeatureFactory mockCameraFeatureFactory = mock(CameraFeatureFactory.class); - final String cameraName = "1"; - final ResolutionPreset resolutionPreset = ResolutionPreset.high; - final boolean enableAudio = false; - - when(mockCameraProperties.getCameraName()).thenReturn(cameraName); - SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); - when(mockCameraFeatureFactory.createSensorOrientationFeature(any(), any(), any())) - .thenReturn(mockSensorOrientationFeature); - - Camera camera = - new Camera( - mockActivity, - mockFlutterTexture, - mockCameraFeatureFactory, - mockDartMessenger, - mockCameraProperties, - resolutionPreset, - enableAudio); - - verify(mockCameraFeatureFactory, times(1)) - .createSensorOrientationFeature(mockCameraProperties, mockActivity, mockDartMessenger); - verify(mockCameraFeatureFactory, times(1)).createAutoFocusFeature(mockCameraProperties, false); - verify(mockCameraFeatureFactory, times(1)).createExposureLockFeature(mockCameraProperties); - verify(mockCameraFeatureFactory, times(1)) - .createExposurePointFeature(eq(mockCameraProperties), eq(mockSensorOrientationFeature)); - verify(mockCameraFeatureFactory, times(1)).createExposureOffsetFeature(mockCameraProperties); - verify(mockCameraFeatureFactory, times(1)).createFlashFeature(mockCameraProperties); - verify(mockCameraFeatureFactory, times(1)) - .createFocusPointFeature(eq(mockCameraProperties), eq(mockSensorOrientationFeature)); - verify(mockCameraFeatureFactory, times(1)).createFpsRangeFeature(mockCameraProperties); - verify(mockCameraFeatureFactory, times(1)).createNoiseReductionFeature(mockCameraProperties); - verify(mockCameraFeatureFactory, times(1)) - .createResolutionFeature(mockCameraProperties, resolutionPreset, cameraName); - verify(mockCameraFeatureFactory, times(1)).createZoomLevelFeature(mockCameraProperties); - assertNotNull("should create a camera", camera); - } - - @Test - public void getDeviceOrientationManager() { - SensorOrientationFeature mockSensorOrientationFeature = - mockCameraFeatureFactory.createSensorOrientationFeature(mockCameraProperties, null, null); - DeviceOrientationManager mockDeviceOrientationManager = mock(DeviceOrientationManager.class); - - when(mockSensorOrientationFeature.getDeviceOrientationManager()) - .thenReturn(mockDeviceOrientationManager); - - DeviceOrientationManager actualDeviceOrientationManager = camera.getDeviceOrientationManager(); - - verify(mockSensorOrientationFeature, times(1)).getDeviceOrientationManager(); - assertEquals(mockDeviceOrientationManager, actualDeviceOrientationManager); - } - - @Test - public void getExposureOffsetStepSize() { - ExposureOffsetFeature mockExposureOffsetFeature = - mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); - double stepSize = 2.3; - - when(mockExposureOffsetFeature.getExposureOffsetStepSize()).thenReturn(stepSize); - - double actualSize = camera.getExposureOffsetStepSize(); - - verify(mockExposureOffsetFeature, times(1)).getExposureOffsetStepSize(); - assertEquals(stepSize, actualSize, 0); - } - - @Test - public void getMaxExposureOffset() { - ExposureOffsetFeature mockExposureOffsetFeature = - mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); - double expectedMaxOffset = 42.0; - - when(mockExposureOffsetFeature.getMaxExposureOffset()).thenReturn(expectedMaxOffset); - - double actualMaxOffset = camera.getMaxExposureOffset(); - - verify(mockExposureOffsetFeature, times(1)).getMaxExposureOffset(); - assertEquals(expectedMaxOffset, actualMaxOffset, 0); - } - - @Test - public void getMinExposureOffset() { - ExposureOffsetFeature mockExposureOffsetFeature = - mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); - double expectedMinOffset = 21.5; - - when(mockExposureOffsetFeature.getMinExposureOffset()).thenReturn(21.5); - - double actualMinOffset = camera.getMinExposureOffset(); - - verify(mockExposureOffsetFeature, times(1)).getMinExposureOffset(); - assertEquals(expectedMinOffset, actualMinOffset, 0); - } - - @Test - public void getMaxZoomLevel() { - ZoomLevelFeature mockZoomLevelFeature = - mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); - float expectedMaxZoomLevel = 4.2f; - - when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(expectedMaxZoomLevel); - - float actualMaxZoomLevel = camera.getMaxZoomLevel(); - - verify(mockZoomLevelFeature, times(1)).getMaximumZoomLevel(); - assertEquals(expectedMaxZoomLevel, actualMaxZoomLevel, 0); - } - - @Test - public void getMinZoomLevel() { - ZoomLevelFeature mockZoomLevelFeature = - mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); - float expectedMinZoomLevel = 4.2f; - - when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(expectedMinZoomLevel); - - float actualMinZoomLevel = camera.getMinZoomLevel(); - - verify(mockZoomLevelFeature, times(1)).getMinimumZoomLevel(); - assertEquals(expectedMinZoomLevel, actualMinZoomLevel, 0); - } - - @Test - public void setExposureMode_shouldUpdateExposureLockFeature() { - ExposureLockFeature mockExposureLockFeature = - mockCameraFeatureFactory.createExposureLockFeature(mockCameraProperties); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - ExposureMode exposureMode = ExposureMode.locked; - - camera.setExposureMode(mockResult, exposureMode); - - verify(mockExposureLockFeature, times(1)).setValue(exposureMode); - verify(mockResult, never()).error(any(), any(), any()); - verify(mockResult, times(1)).success(null); - } - - @Test - public void setExposureMode_shouldUpdateBuilder() { - ExposureLockFeature mockExposureLockFeature = - mockCameraFeatureFactory.createExposureLockFeature(mockCameraProperties); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - ExposureMode exposureMode = ExposureMode.locked; - - camera.setExposureMode(mockResult, exposureMode); - - verify(mockExposureLockFeature, times(1)).updateBuilder(any()); - } - - @Test - public void setExposureMode_shouldCallErrorOnResultOnCameraAccessException() - throws CameraAccessException { - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - ExposureMode exposureMode = ExposureMode.locked; - when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - .thenThrow(new CameraAccessException(0, "")); - - camera.setExposureMode(mockResult, exposureMode); - - verify(mockResult, never()).success(any()); - verify(mockResult, times(1)) - .error("setExposureModeFailed", "Could not set exposure mode.", null); - } - - @Test - public void setExposurePoint_shouldUpdateExposurePointFeature() { - SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); - ExposurePointFeature mockExposurePointFeature = - mockCameraFeatureFactory.createExposurePointFeature( - mockCameraProperties, mockSensorOrientationFeature); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - Point point = new Point(42d, 42d); - - camera.setExposurePoint(mockResult, point); - - verify(mockExposurePointFeature, times(1)).setValue(point); - verify(mockResult, never()).error(any(), any(), any()); - verify(mockResult, times(1)).success(null); - } - - @Test - public void setExposurePoint_shouldUpdateBuilder() { - SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); - ExposurePointFeature mockExposurePointFeature = - mockCameraFeatureFactory.createExposurePointFeature( - mockCameraProperties, mockSensorOrientationFeature); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - Point point = new Point(42d, 42d); - - camera.setExposurePoint(mockResult, point); - - verify(mockExposurePointFeature, times(1)).updateBuilder(any()); - } - - @Test - public void setExposurePoint_shouldCallErrorOnResultOnCameraAccessException() - throws CameraAccessException { - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - Point point = new Point(42d, 42d); - when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - .thenThrow(new CameraAccessException(0, "")); - - camera.setExposurePoint(mockResult, point); - - verify(mockResult, never()).success(any()); - verify(mockResult, times(1)) - .error("setExposurePointFailed", "Could not set exposure point.", null); - } - - @Test - public void setFlashMode_shouldUpdateFlashFeature() { - FlashFeature mockFlashFeature = - mockCameraFeatureFactory.createFlashFeature(mockCameraProperties); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - FlashMode flashMode = FlashMode.always; - - camera.setFlashMode(mockResult, flashMode); - - verify(mockFlashFeature, times(1)).setValue(flashMode); - verify(mockResult, never()).error(any(), any(), any()); - verify(mockResult, times(1)).success(null); - } - - @Test - public void setFlashMode_shouldUpdateBuilder() { - FlashFeature mockFlashFeature = - mockCameraFeatureFactory.createFlashFeature(mockCameraProperties); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - FlashMode flashMode = FlashMode.always; - - camera.setFlashMode(mockResult, flashMode); - - verify(mockFlashFeature, times(1)).updateBuilder(any()); - } - - @Test - public void setFlashMode_shouldCallErrorOnResultOnCameraAccessException() - throws CameraAccessException { - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - FlashMode flashMode = FlashMode.always; - when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - .thenThrow(new CameraAccessException(0, "")); - - camera.setFlashMode(mockResult, flashMode); - - verify(mockResult, never()).success(any()); - verify(mockResult, times(1)).error("setFlashModeFailed", "Could not set flash mode.", null); - } - - @Test - public void setFocusPoint_shouldUpdateFocusPointFeature() { - SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); - FocusPointFeature mockFocusPointFeature = - mockCameraFeatureFactory.createFocusPointFeature( - mockCameraProperties, mockSensorOrientationFeature); - AutoFocusFeature mockAutoFocusFeature = - mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - Point point = new Point(42d, 42d); - when(mockAutoFocusFeature.getValue()).thenReturn(FocusMode.auto); - - camera.setFocusPoint(mockResult, point); - - verify(mockFocusPointFeature, times(1)).setValue(point); - verify(mockResult, never()).error(any(), any(), any()); - verify(mockResult, times(1)).success(null); - } - - @Test - public void setFocusPoint_shouldUpdateBuilder() { - SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); - FocusPointFeature mockFocusPointFeature = - mockCameraFeatureFactory.createFocusPointFeature( - mockCameraProperties, mockSensorOrientationFeature); - AutoFocusFeature mockAutoFocusFeature = - mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - Point point = new Point(42d, 42d); - when(mockAutoFocusFeature.getValue()).thenReturn(FocusMode.auto); - - camera.setFocusPoint(mockResult, point); - - verify(mockFocusPointFeature, times(1)).updateBuilder(any()); - } - - @Test - public void setFocusPoint_shouldCallErrorOnResultOnCameraAccessException() - throws CameraAccessException { - AutoFocusFeature mockAutoFocusFeature = - mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - Point point = new Point(42d, 42d); - when(mockAutoFocusFeature.getValue()).thenReturn(FocusMode.auto); - when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - .thenThrow(new CameraAccessException(0, "")); - - camera.setFocusPoint(mockResult, point); - - verify(mockResult, never()).success(any()); - verify(mockResult, times(1)).error("setFocusPointFailed", "Could not set focus point.", null); - } - - @Test - public void setZoomLevel_shouldUpdateZoomLevelFeature() throws CameraAccessException { - ZoomLevelFeature mockZoomLevelFeature = - mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - float zoomLevel = 1.0f; - - when(mockZoomLevelFeature.getValue()).thenReturn(zoomLevel); - when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(0f); - when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(2f); - - camera.setZoomLevel(mockResult, zoomLevel); - - verify(mockZoomLevelFeature, times(1)).setValue(zoomLevel); - verify(mockResult, never()).error(any(), any(), any()); - verify(mockResult, times(1)).success(null); - } - - @Test - public void setZoomLevel_shouldUpdateBuilder() throws CameraAccessException { - ZoomLevelFeature mockZoomLevelFeature = - mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - float zoomLevel = 1.0f; - - when(mockZoomLevelFeature.getValue()).thenReturn(zoomLevel); - when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(0f); - when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(2f); - - camera.setZoomLevel(mockResult, zoomLevel); - - verify(mockZoomLevelFeature, times(1)).updateBuilder(any()); - } - - @Test - public void setZoomLevel_shouldCallErrorOnResultOnCameraAccessException() - throws CameraAccessException { - ZoomLevelFeature mockZoomLevelFeature = - mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - float zoomLevel = 1.0f; - - when(mockZoomLevelFeature.getValue()).thenReturn(zoomLevel); - when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(0f); - when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(2f); - when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - .thenThrow(new CameraAccessException(0, "")); - - camera.setZoomLevel(mockResult, zoomLevel); - - verify(mockResult, never()).success(any()); - verify(mockResult, times(1)).error("setZoomLevelFailed", "Could not set zoom level.", null); - } - - @Test - public void pauseVideoRecording_shouldSendNullResultWhenNotRecording() { - TestUtils.setPrivateField(camera, "recordingVideo", false); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - camera.pauseVideoRecording(mockResult); - - verify(mockResult, times(1)).success(null); - verify(mockResult, never()).error(any(), any(), any()); - } - - @Test - public void pauseVideoRecording_shouldCallPauseWhenRecordingAndOnAPIN() { - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(camera, "recordingVideo", true); - TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); - - camera.pauseVideoRecording(mockResult); - - verify(mockMediaRecorder, times(1)).pause(); - verify(mockResult, times(1)).success(null); - verify(mockResult, never()).error(any(), any(), any()); - } - - @Test - public void pauseVideoRecording_shouldSendVideoRecordingFailedErrorWhenVersionCodeSmallerThenN() { - TestUtils.setPrivateField(camera, "recordingVideo", true); - TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 23); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - camera.pauseVideoRecording(mockResult); - - verify(mockResult, times(1)) - .error("videoRecordingFailed", "pauseVideoRecording requires Android API +24.", null); - verify(mockResult, never()).success(any()); - } - - @Test - public void - pauseVideoRecording_shouldSendVideoRecordingFailedErrorWhenMediaRecorderPauseThrowsIllegalStateException() { - MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(camera, "recordingVideo", true); - TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); - - IllegalStateException expectedException = new IllegalStateException("Test error message"); - - doThrow(expectedException).when(mockMediaRecorder).pause(); - - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - camera.pauseVideoRecording(mockResult); - - verify(mockResult, times(1)).error("videoRecordingFailed", "Test error message", null); - verify(mockResult, never()).success(any()); - } - - @Test - public void resumeVideoRecording_shouldSendNullResultWhenNotRecording() { - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - TestUtils.setPrivateField(camera, "recordingVideo", false); - - camera.resumeVideoRecording(mockResult); - - verify(mockResult, times(1)).success(null); - verify(mockResult, never()).error(any(), any(), any()); - } - - @Test - public void resumeVideoRecording_shouldCallPauseWhenRecordingAndOnAPIN() { - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(camera, "recordingVideo", true); - TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); - - camera.resumeVideoRecording(mockResult); - - verify(mockMediaRecorder, times(1)).resume(); - verify(mockResult, times(1)).success(null); - verify(mockResult, never()).error(any(), any(), any()); - } - - @Test - public void setDescriptionWhileRecording() { - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - VideoRenderer mockVideoRenderer = mock(VideoRenderer.class); - TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(camera, "recordingVideo", true); - TestUtils.setPrivateField(camera, "videoRenderer", mockVideoRenderer); - - final CameraProperties newCameraProperties = mock(CameraProperties.class); - camera.setDescriptionWhileRecording(mockResult, newCameraProperties); - - if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { - verify(mockResult, times(1)) - .error( - eq("setDescriptionWhileRecordingFailed"), - eq("Device does not support switching the camera while recording"), - eq(null)); - } else { - verify(mockResult, times(1)).success(null); - verify(mockResult, never()).error(any(), any(), any()); - } - } + // @Test + // public void shouldNotImplementLifecycleObserverInterface() { + // Class cameraClass = Camera.class; + + // assertFalse(LifecycleObserver.class.isAssignableFrom(cameraClass)); + // } + + // @Test + // public void shouldCreateCameraPluginAndSetAllFeatures() { + // final Activity mockActivity = mock(Activity.class); + // final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = + // mock(TextureRegistry.SurfaceTextureEntry.class); + // final CameraFeatureFactory mockCameraFeatureFactory = mock(CameraFeatureFactory.class); + // final String cameraName = "1"; + // final ResolutionPreset resolutionPreset = ResolutionPreset.high; + // final boolean enableAudio = false; + + // when(mockCameraProperties.getCameraName()).thenReturn(cameraName); + // SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); + // when(mockCameraFeatureFactory.createSensorOrientationFeature(any(), any(), any())) + // .thenReturn(mockSensorOrientationFeature); + + // Camera camera = + // new Camera( + // mockActivity, + // mockFlutterTexture, + // mockCameraFeatureFactory, + // mockDartMessenger, + // mockCameraProperties, + // resolutionPreset, + // enableAudio); + + // verify(mockCameraFeatureFactory, times(1)) + // .createSensorOrientationFeature(mockCameraProperties, mockActivity, mockDartMessenger); + // verify(mockCameraFeatureFactory, times(1)).createAutoFocusFeature(mockCameraProperties, false); + // verify(mockCameraFeatureFactory, times(1)).createExposureLockFeature(mockCameraProperties); + // verify(mockCameraFeatureFactory, times(1)) + // .createExposurePointFeature(eq(mockCameraProperties), eq(mockSensorOrientationFeature)); + // verify(mockCameraFeatureFactory, times(1)).createExposureOffsetFeature(mockCameraProperties); + // verify(mockCameraFeatureFactory, times(1)).createFlashFeature(mockCameraProperties); + // verify(mockCameraFeatureFactory, times(1)) + // .createFocusPointFeature(eq(mockCameraProperties), eq(mockSensorOrientationFeature)); + // verify(mockCameraFeatureFactory, times(1)).createFpsRangeFeature(mockCameraProperties); + // verify(mockCameraFeatureFactory, times(1)).createNoiseReductionFeature(mockCameraProperties); + // verify(mockCameraFeatureFactory, times(1)) + // .createResolutionFeature(mockCameraProperties, resolutionPreset, cameraName); + // verify(mockCameraFeatureFactory, times(1)).createZoomLevelFeature(mockCameraProperties); + // assertNotNull("should create a camera", camera); + // } + + // @Test + // public void getDeviceOrientationManager() { + // SensorOrientationFeature mockSensorOrientationFeature = + // mockCameraFeatureFactory.createSensorOrientationFeature(mockCameraProperties, null, null); + // DeviceOrientationManager mockDeviceOrientationManager = mock(DeviceOrientationManager.class); + + // when(mockSensorOrientationFeature.getDeviceOrientationManager()) + // .thenReturn(mockDeviceOrientationManager); + + // DeviceOrientationManager actualDeviceOrientationManager = camera.getDeviceOrientationManager(); + + // verify(mockSensorOrientationFeature, times(1)).getDeviceOrientationManager(); + // assertEquals(mockDeviceOrientationManager, actualDeviceOrientationManager); + // } + + // @Test + // public void getExposureOffsetStepSize() { + // ExposureOffsetFeature mockExposureOffsetFeature = + // mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); + // double stepSize = 2.3; + + // when(mockExposureOffsetFeature.getExposureOffsetStepSize()).thenReturn(stepSize); + + // double actualSize = camera.getExposureOffsetStepSize(); + + // verify(mockExposureOffsetFeature, times(1)).getExposureOffsetStepSize(); + // assertEquals(stepSize, actualSize, 0); + // } + + // @Test + // public void getMaxExposureOffset() { + // ExposureOffsetFeature mockExposureOffsetFeature = + // mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); + // double expectedMaxOffset = 42.0; + + // when(mockExposureOffsetFeature.getMaxExposureOffset()).thenReturn(expectedMaxOffset); + + // double actualMaxOffset = camera.getMaxExposureOffset(); + + // verify(mockExposureOffsetFeature, times(1)).getMaxExposureOffset(); + // assertEquals(expectedMaxOffset, actualMaxOffset, 0); + // } + + // @Test + // public void getMinExposureOffset() { + // ExposureOffsetFeature mockExposureOffsetFeature = + // mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); + // double expectedMinOffset = 21.5; + + // when(mockExposureOffsetFeature.getMinExposureOffset()).thenReturn(21.5); + + // double actualMinOffset = camera.getMinExposureOffset(); + + // verify(mockExposureOffsetFeature, times(1)).getMinExposureOffset(); + // assertEquals(expectedMinOffset, actualMinOffset, 0); + // } + + // @Test + // public void getMaxZoomLevel() { + // ZoomLevelFeature mockZoomLevelFeature = + // mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); + // float expectedMaxZoomLevel = 4.2f; + + // when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(expectedMaxZoomLevel); + + // float actualMaxZoomLevel = camera.getMaxZoomLevel(); + + // verify(mockZoomLevelFeature, times(1)).getMaximumZoomLevel(); + // assertEquals(expectedMaxZoomLevel, actualMaxZoomLevel, 0); + // } + + // @Test + // public void getMinZoomLevel() { + // ZoomLevelFeature mockZoomLevelFeature = + // mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); + // float expectedMinZoomLevel = 4.2f; + + // when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(expectedMinZoomLevel); + + // float actualMinZoomLevel = camera.getMinZoomLevel(); + + // verify(mockZoomLevelFeature, times(1)).getMinimumZoomLevel(); + // assertEquals(expectedMinZoomLevel, actualMinZoomLevel, 0); + // } + + // @Test + // public void setExposureMode_shouldUpdateExposureLockFeature() { + // ExposureLockFeature mockExposureLockFeature = + // mockCameraFeatureFactory.createExposureLockFeature(mockCameraProperties); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // ExposureMode exposureMode = ExposureMode.locked; + + // camera.setExposureMode(mockResult, exposureMode); + + // verify(mockExposureLockFeature, times(1)).setValue(exposureMode); + // verify(mockResult, never()).error(any(), any(), any()); + // verify(mockResult, times(1)).success(null); + // } + + // @Test + // public void setExposureMode_shouldUpdateBuilder() { + // ExposureLockFeature mockExposureLockFeature = + // mockCameraFeatureFactory.createExposureLockFeature(mockCameraProperties); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // ExposureMode exposureMode = ExposureMode.locked; + + // camera.setExposureMode(mockResult, exposureMode); + + // verify(mockExposureLockFeature, times(1)).updateBuilder(any()); + // } + + // @Test + // public void setExposureMode_shouldCallErrorOnResultOnCameraAccessException() + // throws CameraAccessException { + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // ExposureMode exposureMode = ExposureMode.locked; + // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + // .thenThrow(new CameraAccessException(0, "")); + + // camera.setExposureMode(mockResult, exposureMode); + + // verify(mockResult, never()).success(any()); + // verify(mockResult, times(1)) + // .error("setExposureModeFailed", "Could not set exposure mode.", null); + // } + + // @Test + // public void setExposurePoint_shouldUpdateExposurePointFeature() { + // SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); + // ExposurePointFeature mockExposurePointFeature = + // mockCameraFeatureFactory.createExposurePointFeature( + // mockCameraProperties, mockSensorOrientationFeature); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // Point point = new Point(42d, 42d); + + // camera.setExposurePoint(mockResult, point); + + // verify(mockExposurePointFeature, times(1)).setValue(point); + // verify(mockResult, never()).error(any(), any(), any()); + // verify(mockResult, times(1)).success(null); + // } + + // @Test + // public void setExposurePoint_shouldUpdateBuilder() { + // SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); + // ExposurePointFeature mockExposurePointFeature = + // mockCameraFeatureFactory.createExposurePointFeature( + // mockCameraProperties, mockSensorOrientationFeature); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // Point point = new Point(42d, 42d); + + // camera.setExposurePoint(mockResult, point); + + // verify(mockExposurePointFeature, times(1)).updateBuilder(any()); + // } + + // @Test + // public void setExposurePoint_shouldCallErrorOnResultOnCameraAccessException() + // throws CameraAccessException { + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // Point point = new Point(42d, 42d); + // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + // .thenThrow(new CameraAccessException(0, "")); + + // camera.setExposurePoint(mockResult, point); + + // verify(mockResult, never()).success(any()); + // verify(mockResult, times(1)) + // .error("setExposurePointFailed", "Could not set exposure point.", null); + // } + + // @Test + // public void setFlashMode_shouldUpdateFlashFeature() { + // FlashFeature mockFlashFeature = + // mockCameraFeatureFactory.createFlashFeature(mockCameraProperties); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // FlashMode flashMode = FlashMode.always; + + // camera.setFlashMode(mockResult, flashMode); + + // verify(mockFlashFeature, times(1)).setValue(flashMode); + // verify(mockResult, never()).error(any(), any(), any()); + // verify(mockResult, times(1)).success(null); + // } + + // @Test + // public void setFlashMode_shouldUpdateBuilder() { + // FlashFeature mockFlashFeature = + // mockCameraFeatureFactory.createFlashFeature(mockCameraProperties); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // FlashMode flashMode = FlashMode.always; + + // camera.setFlashMode(mockResult, flashMode); + + // verify(mockFlashFeature, times(1)).updateBuilder(any()); + // } + + // @Test + // public void setFlashMode_shouldCallErrorOnResultOnCameraAccessException() + // throws CameraAccessException { + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // FlashMode flashMode = FlashMode.always; + // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + // .thenThrow(new CameraAccessException(0, "")); + + // camera.setFlashMode(mockResult, flashMode); + + // verify(mockResult, never()).success(any()); + // verify(mockResult, times(1)).error("setFlashModeFailed", "Could not set flash mode.", null); + // } + + // @Test + // public void setFocusPoint_shouldUpdateFocusPointFeature() { + // SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); + // FocusPointFeature mockFocusPointFeature = + // mockCameraFeatureFactory.createFocusPointFeature( + // mockCameraProperties, mockSensorOrientationFeature); + // AutoFocusFeature mockAutoFocusFeature = + // mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // Point point = new Point(42d, 42d); + // when(mockAutoFocusFeature.getValue()).thenReturn(FocusMode.auto); + + // camera.setFocusPoint(mockResult, point); + + // verify(mockFocusPointFeature, times(1)).setValue(point); + // verify(mockResult, never()).error(any(), any(), any()); + // verify(mockResult, times(1)).success(null); + // } + + // @Test + // public void setFocusPoint_shouldUpdateBuilder() { + // SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); + // FocusPointFeature mockFocusPointFeature = + // mockCameraFeatureFactory.createFocusPointFeature( + // mockCameraProperties, mockSensorOrientationFeature); + // AutoFocusFeature mockAutoFocusFeature = + // mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // Point point = new Point(42d, 42d); + // when(mockAutoFocusFeature.getValue()).thenReturn(FocusMode.auto); + + // camera.setFocusPoint(mockResult, point); + + // verify(mockFocusPointFeature, times(1)).updateBuilder(any()); + // } + + // @Test + // public void setFocusPoint_shouldCallErrorOnResultOnCameraAccessException() + // throws CameraAccessException { + // AutoFocusFeature mockAutoFocusFeature = + // mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // Point point = new Point(42d, 42d); + // when(mockAutoFocusFeature.getValue()).thenReturn(FocusMode.auto); + // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + // .thenThrow(new CameraAccessException(0, "")); + + // camera.setFocusPoint(mockResult, point); + + // verify(mockResult, never()).success(any()); + // verify(mockResult, times(1)).error("setFocusPointFailed", "Could not set focus point.", null); + // } + + // @Test + // public void setZoomLevel_shouldUpdateZoomLevelFeature() throws CameraAccessException { + // ZoomLevelFeature mockZoomLevelFeature = + // mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // float zoomLevel = 1.0f; + + // when(mockZoomLevelFeature.getValue()).thenReturn(zoomLevel); + // when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(0f); + // when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(2f); + + // camera.setZoomLevel(mockResult, zoomLevel); + + // verify(mockZoomLevelFeature, times(1)).setValue(zoomLevel); + // verify(mockResult, never()).error(any(), any(), any()); + // verify(mockResult, times(1)).success(null); + // } + + // @Test + // public void setZoomLevel_shouldUpdateBuilder() throws CameraAccessException { + // ZoomLevelFeature mockZoomLevelFeature = + // mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // float zoomLevel = 1.0f; + + // when(mockZoomLevelFeature.getValue()).thenReturn(zoomLevel); + // when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(0f); + // when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(2f); + + // camera.setZoomLevel(mockResult, zoomLevel); + + // verify(mockZoomLevelFeature, times(1)).updateBuilder(any()); + // } + + // @Test + // public void setZoomLevel_shouldCallErrorOnResultOnCameraAccessException() + // throws CameraAccessException { + // ZoomLevelFeature mockZoomLevelFeature = + // mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // float zoomLevel = 1.0f; + + // when(mockZoomLevelFeature.getValue()).thenReturn(zoomLevel); + // when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(0f); + // when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(2f); + // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + // .thenThrow(new CameraAccessException(0, "")); + + // camera.setZoomLevel(mockResult, zoomLevel); + + // verify(mockResult, never()).success(any()); + // verify(mockResult, times(1)).error("setZoomLevelFailed", "Could not set zoom level.", null); + // } + + // @Test + // public void pauseVideoRecording_shouldSendNullResultWhenNotRecording() { + // TestUtils.setPrivateField(camera, "recordingVideo", false); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + // camera.pauseVideoRecording(mockResult); + + // verify(mockResult, times(1)).success(null); + // verify(mockResult, never()).error(any(), any(), any()); + // } + + // @Test + // public void pauseVideoRecording_shouldCallPauseWhenRecordingAndOnAPIN() { + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); + // TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); + // TestUtils.setPrivateField(camera, "recordingVideo", true); + // TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); + + // camera.pauseVideoRecording(mockResult); + + // verify(mockMediaRecorder, times(1)).pause(); + // verify(mockResult, times(1)).success(null); + // verify(mockResult, never()).error(any(), any(), any()); + // } + + // @Test + // public void pauseVideoRecording_shouldSendVideoRecordingFailedErrorWhenVersionCodeSmallerThenN() { + // TestUtils.setPrivateField(camera, "recordingVideo", true); + // TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 23); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + // camera.pauseVideoRecording(mockResult); + + // verify(mockResult, times(1)) + // .error("videoRecordingFailed", "pauseVideoRecording requires Android API +24.", null); + // verify(mockResult, never()).success(any()); + // } + + // @Test + // public void + // pauseVideoRecording_shouldSendVideoRecordingFailedErrorWhenMediaRecorderPauseThrowsIllegalStateException() { + // MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); + // TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); + // TestUtils.setPrivateField(camera, "recordingVideo", true); + // TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); + + // IllegalStateException expectedException = new IllegalStateException("Test error message"); + + // doThrow(expectedException).when(mockMediaRecorder).pause(); + + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + // camera.pauseVideoRecording(mockResult); + + // verify(mockResult, times(1)).error("videoRecordingFailed", "Test error message", null); + // verify(mockResult, never()).success(any()); + // } + + // @Test + // public void resumeVideoRecording_shouldSendNullResultWhenNotRecording() { + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // TestUtils.setPrivateField(camera, "recordingVideo", false); + + // camera.resumeVideoRecording(mockResult); + + // verify(mockResult, times(1)).success(null); + // verify(mockResult, never()).error(any(), any(), any()); + // } + + // @Test + // public void resumeVideoRecording_shouldCallPauseWhenRecordingAndOnAPIN() { + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); + // TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); + // TestUtils.setPrivateField(camera, "recordingVideo", true); + // TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); + + // camera.resumeVideoRecording(mockResult); + + // verify(mockMediaRecorder, times(1)).resume(); + // verify(mockResult, times(1)).success(null); + // verify(mockResult, never()).error(any(), any(), any()); + // } + + // @Test + // public void setDescriptionWhileRecording() { + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); + // VideoRenderer mockVideoRenderer = mock(VideoRenderer.class); + // TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); + // TestUtils.setPrivateField(camera, "recordingVideo", true); + // TestUtils.setPrivateField(camera, "videoRenderer", mockVideoRenderer); + + // final CameraProperties newCameraProperties = mock(CameraProperties.class); + // camera.setDescriptionWhileRecording(mockResult, newCameraProperties); + + // if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { + // verify(mockResult, times(1)) + // .error( + // eq("setDescriptionWhileRecordingFailed"), + // eq("Device does not support switching the camera while recording"), + // eq(null)); + // } else { + // verify(mockResult, times(1)).success(null); + // verify(mockResult, never()).error(any(), any(), any()); + // } + // } @Test public void startPreview_shouldPullStreamFromVideoRenderer() @@ -681,7 +668,7 @@ public void startPreview_shouldPullStreamFromImageReader() when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); - verify(mockImageReader, times(1)) + verify(mockImageReader, times(2)) .getSurface(); // stream pulled from regular imageReader's surface. } @@ -742,108 +729,108 @@ public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() camera.startPreviewWithImageStream(mock(EventChannel.class)); verify(mockImageStreamReader, times(1)) .getSurface(); // stream pulled from image streaming imageReader's surface. - verify(mockPictureImageReader, times(2)) + verify(mockPictureImageReader, times(3)) .getSurface(); // stream pulled from regular imageReader's surface. } - @Test - public void setDescriptionWhileRecording_shouldErrorWhenNotRecording() { - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - TestUtils.setPrivateField(camera, "recordingVideo", false); - final CameraProperties newCameraProperties = mock(CameraProperties.class); - camera.setDescriptionWhileRecording(mockResult, newCameraProperties); - - verify(mockResult, times(1)) - .error("setDescriptionWhileRecordingFailed", "Device was not recording", null); - verify(mockResult, never()).success(any()); - } - - @Test - public void - resumeVideoRecording_shouldSendVideoRecordingFailedErrorWhenVersionCodeSmallerThanN() { - TestUtils.setPrivateField(camera, "recordingVideo", true); - TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 23); - - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - camera.resumeVideoRecording(mockResult); - - verify(mockResult, times(1)) - .error("videoRecordingFailed", "resumeVideoRecording requires Android API +24.", null); - verify(mockResult, never()).success(any()); - } - - @Test - public void - resumeVideoRecording_shouldSendVideoRecordingFailedErrorWhenMediaRecorderPauseThrowsIllegalStateException() { - MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(camera, "recordingVideo", true); - TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); - - IllegalStateException expectedException = new IllegalStateException("Test error message"); - - doThrow(expectedException).when(mockMediaRecorder).resume(); - - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - camera.resumeVideoRecording(mockResult); - - verify(mockResult, times(1)).error("videoRecordingFailed", "Test error message", null); - verify(mockResult, never()).success(any()); - } - - @Test - public void setFocusMode_shouldUpdateAutoFocusFeature() { - AutoFocusFeature mockAutoFocusFeature = - mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - camera.setFocusMode(mockResult, FocusMode.auto); - - verify(mockAutoFocusFeature, times(1)).setValue(FocusMode.auto); - verify(mockResult, never()).error(any(), any(), any()); - verify(mockResult, times(1)).success(null); - } - - @Test - public void setFocusMode_shouldUpdateBuilder() { - AutoFocusFeature mockAutoFocusFeature = - mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - camera.setFocusMode(mockResult, FocusMode.auto); - - verify(mockAutoFocusFeature, times(1)).updateBuilder(any()); - } - - @Test - public void setFocusMode_shouldUnlockAutoFocusForAutoMode() { - camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); - verify(mockPreviewRequestBuilder, times(1)) - .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); - verify(mockPreviewRequestBuilder, times(1)) - .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_IDLE); - } - - @Test - public void setFocusMode_shouldSkipUnlockAutoFocusWhenNullCaptureSession() { - TestUtils.setPrivateField(camera, "captureSession", null); - camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); - verify(mockPreviewRequestBuilder, never()) - .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); - verify(mockPreviewRequestBuilder, never()) - .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_IDLE); - } - - @Test - public void setFocusMode_shouldSendErrorEventOnUnlockAutoFocusCameraAccessException() - throws CameraAccessException { - when(mockCaptureSession.capture(any(), any(), any())) - .thenThrow(new CameraAccessException(0, "")); - camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); - verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); - } + // @Test + // public void setDescriptionWhileRecording_shouldErrorWhenNotRecording() { + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // TestUtils.setPrivateField(camera, "recordingVideo", false); + // final CameraProperties newCameraProperties = mock(CameraProperties.class); + // camera.setDescriptionWhileRecording(mockResult, newCameraProperties); + + // verify(mockResult, times(1)) + // .error("setDescriptionWhileRecordingFailed", "Device was not recording", null); + // verify(mockResult, never()).success(any()); + // } + + // @Test + // public void + // resumeVideoRecording_shouldSendVideoRecordingFailedErrorWhenVersionCodeSmallerThanN() { + // TestUtils.setPrivateField(camera, "recordingVideo", true); + // TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 23); + + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + // camera.resumeVideoRecording(mockResult); + + // verify(mockResult, times(1)) + // .error("videoRecordingFailed", "resumeVideoRecording requires Android API +24.", null); + // verify(mockResult, never()).success(any()); + // } + + // @Test + // public void + // resumeVideoRecording_shouldSendVideoRecordingFailedErrorWhenMediaRecorderPauseThrowsIllegalStateException() { + // MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); + // TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); + // TestUtils.setPrivateField(camera, "recordingVideo", true); + // TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); + + // IllegalStateException expectedException = new IllegalStateException("Test error message"); + + // doThrow(expectedException).when(mockMediaRecorder).resume(); + + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + // camera.resumeVideoRecording(mockResult); + + // verify(mockResult, times(1)).error("videoRecordingFailed", "Test error message", null); + // verify(mockResult, never()).success(any()); + // } + + // @Test + // public void setFocusMode_shouldUpdateAutoFocusFeature() { + // AutoFocusFeature mockAutoFocusFeature = + // mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + // camera.setFocusMode(mockResult, FocusMode.auto); + + // verify(mockAutoFocusFeature, times(1)).setValue(FocusMode.auto); + // verify(mockResult, never()).error(any(), any(), any()); + // verify(mockResult, times(1)).success(null); + // } + + // @Test + // public void setFocusMode_shouldUpdateBuilder() { + // AutoFocusFeature mockAutoFocusFeature = + // mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + // camera.setFocusMode(mockResult, FocusMode.auto); + + // verify(mockAutoFocusFeature, times(1)).updateBuilder(any()); + // } + + // @Test + // public void setFocusMode_shouldUnlockAutoFocusForAutoMode() { + // camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); + // verify(mockPreviewRequestBuilder, times(1)) + // .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); + // verify(mockPreviewRequestBuilder, times(1)) + // .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_IDLE); + // } + + // @Test + // public void setFocusMode_shouldSkipUnlockAutoFocusWhenNullCaptureSession() { + // TestUtils.setPrivateField(camera, "captureSession", null); + // camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); + // verify(mockPreviewRequestBuilder, never()) + // .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); + // verify(mockPreviewRequestBuilder, never()) + // .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_IDLE); + // } + + // @Test + // public void setFocusMode_shouldSendErrorEventOnUnlockAutoFocusCameraAccessException() + // throws CameraAccessException { + // when(mockCaptureSession.capture(any(), any(), any())) + // .thenThrow(new CameraAccessException(0, "")); + // camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); + // verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); + // } @Test public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader() @@ -871,219 +858,219 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader when(mockMediaRecorder.getSurface()).thenReturn(mock(Surface.class)); when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); - camera.startVideoRecording(mock(MethodChannel.Result.class), mock(EventChannel.class)); + camera.startVideoRecording(mock(MethodChannel.Result.class), null); verify(mockMediaRecorder, times(1)) .getSurface(); // stream pulled from media recorder's surface. verify(mockPictureImageReader, times(1)) .getSurface(); // stream pulled from image streaming imageReader's surface. } - @Test - public void setFocusMode_shouldLockAutoFocusForLockedMode() throws CameraAccessException { - camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); - verify(mockPreviewRequestBuilder, times(1)) - .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); - verify(mockCaptureSession, times(1)).capture(any(), any(), any()); - verify(mockCaptureSession, times(1)).setRepeatingRequest(any(), any(), any()); - } - - @Test - public void setFocusMode_shouldSkipLockAutoFocusWhenNullCaptureSession() { - TestUtils.setPrivateField(camera, "captureSession", null); - camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); - verify(mockPreviewRequestBuilder, never()) - .set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START); - } - - @Test - public void setFocusMode_shouldSendErrorEventOnLockAutoFocusCameraAccessException() - throws CameraAccessException { - when(mockCaptureSession.capture(any(), any(), any())) - .thenThrow(new CameraAccessException(0, "")); - camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); - verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); - } - - @Test - public void setFocusMode_shouldCallErrorOnResultOnCameraAccessException() - throws CameraAccessException { - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - .thenThrow(new CameraAccessException(0, "")); - - camera.setFocusMode(mockResult, FocusMode.locked); - - verify(mockResult, never()).success(any()); - verify(mockResult, times(1)) - .error("setFocusModeFailed", "Error setting focus mode: null", null); - } - - @Test - public void setExposureOffset_shouldUpdateExposureOffsetFeature() { - ExposureOffsetFeature mockExposureOffsetFeature = - mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - when(mockExposureOffsetFeature.getValue()).thenReturn(1.0); - - camera.setExposureOffset(mockResult, 1.0); - - verify(mockExposureOffsetFeature, times(1)).setValue(1.0); - verify(mockResult, never()).error(any(), any(), any()); - verify(mockResult, times(1)).success(1.0); - } - - @Test - public void setExposureOffset_shouldAndUpdateBuilder() { - ExposureOffsetFeature mockExposureOffsetFeature = - mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - camera.setExposureOffset(mockResult, 1.0); - - verify(mockExposureOffsetFeature, times(1)).updateBuilder(any()); - } - - @Test - public void setExposureOffset_shouldCallErrorOnResultOnCameraAccessException() - throws CameraAccessException { - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - .thenThrow(new CameraAccessException(0, "")); - - camera.setExposureOffset(mockResult, 1.0); - - verify(mockResult, never()).success(any()); - verify(mockResult, times(1)) - .error("setExposureOffsetFailed", "Could not set exposure offset.", null); - } - - @Test - public void lockCaptureOrientation_shouldLockCaptureOrientation() { - final Activity mockActivity = mock(Activity.class); - SensorOrientationFeature mockSensorOrientationFeature = - mockCameraFeatureFactory.createSensorOrientationFeature( - mockCameraProperties, mockActivity, mockDartMessenger); - - camera.lockCaptureOrientation(PlatformChannel.DeviceOrientation.PORTRAIT_UP); - - verify(mockSensorOrientationFeature, times(1)) - .lockCaptureOrientation(PlatformChannel.DeviceOrientation.PORTRAIT_UP); - } - - @Test - public void unlockCaptureOrientation_shouldUnlockCaptureOrientation() { - final Activity mockActivity = mock(Activity.class); - SensorOrientationFeature mockSensorOrientationFeature = - mockCameraFeatureFactory.createSensorOrientationFeature( - mockCameraProperties, mockActivity, mockDartMessenger); - - camera.unlockCaptureOrientation(); - - verify(mockSensorOrientationFeature, times(1)).unlockCaptureOrientation(); - } - - @Test - public void pausePreview_shouldPausePreview() throws CameraAccessException { - camera.pausePreview(); - - assertEquals(TestUtils.getPrivateField(camera, "pausedPreview"), true); - verify(mockCaptureSession, times(1)).stopRepeating(); - } - - @Test - public void resumePreview_shouldResumePreview() throws CameraAccessException { - camera.resumePreview(); - - assertEquals(TestUtils.getPrivateField(camera, "pausedPreview"), false); - verify(mockCaptureSession, times(1)).setRepeatingRequest(any(), any(), any()); - } - - @Test - public void resumePreview_shouldSendErrorEventOnCameraAccessException() - throws CameraAccessException { - when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - .thenThrow(new CameraAccessException(0)); - - camera.resumePreview(); - - verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); - } - - @Test - public void startBackgroundThread_shouldStartNewThread() { - camera.startBackgroundThread(); - - verify(mockHandlerThread, times(1)).start(); - assertEquals(mockHandler, TestUtils.getPrivateField(camera, "backgroundHandler")); - } - - @Test - public void startBackgroundThread_shouldNotStartNewThreadWhenAlreadyCreated() { - camera.startBackgroundThread(); - camera.startBackgroundThread(); - - verify(mockHandlerThread, times(1)).start(); - } - - @Test - public void stopBackgroundThread_quitsSafely() throws InterruptedException { - camera.startBackgroundThread(); - camera.stopBackgroundThread(); - - verify(mockHandlerThread).quitSafely(); - verify(mockHandlerThread, never()).join(); - } - - @Test - public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAccessException { - ArrayList mockRequestBuilders = new ArrayList<>(); - mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); - CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - // Stub out other features used by the flow. - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); - TestUtils.setPrivateField(camera, "pictureImageReader", mock(ImageReader.class)); - SensorOrientationFeature mockSensorOrientationFeature = - mockCameraFeatureFactory.createSensorOrientationFeature(mockCameraProperties, null, null); - DeviceOrientationManager mockDeviceOrientationManager = mock(DeviceOrientationManager.class); - when(mockSensorOrientationFeature.getDeviceOrientationManager()) - .thenReturn(mockDeviceOrientationManager); - - // Simulate a post-precapture flow. - camera.onConverged(); - // A picture should be taken. - verify(mockCaptureSession, times(1)).capture(any(), any(), any()); - // The session shuold not be aborted as part of this flow, as this breaks capture on some - // devices, and causes delays on others. - verify(mockCaptureSession, never()).abortCaptures(); - } - - @Test - public void createCaptureSession_doesNotCloseCaptureSession() throws CameraAccessException { - Surface mockSurface = mock(Surface.class); - SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); - ResolutionFeature mockResolutionFeature = mock(ResolutionFeature.class); - Size mockSize = mock(Size.class); - ArrayList mockRequestBuilders = new ArrayList<>(); - mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); - CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); - - TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = - (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); - CameraFeatures cameraFeatures = - (CameraFeatures) TestUtils.getPrivateField(camera, "cameraFeatures"); - ResolutionFeature resolutionFeature = - (ResolutionFeature) - TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); - - when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); - when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); - - camera.createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, mockSurface); - - verify(mockCaptureSession, never()).close(); - } + // @Test + // public void setFocusMode_shouldLockAutoFocusForLockedMode() throws CameraAccessException { + // camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); + // verify(mockPreviewRequestBuilder, times(1)) + // .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); + // verify(mockCaptureSession, times(1)).capture(any(), any(), any()); + // verify(mockCaptureSession, times(1)).setRepeatingRequest(any(), any(), any()); + // } + + // @Test + // public void setFocusMode_shouldSkipLockAutoFocusWhenNullCaptureSession() { + // TestUtils.setPrivateField(camera, "captureSession", null); + // camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); + // verify(mockPreviewRequestBuilder, never()) + // .set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START); + // } + + // @Test + // public void setFocusMode_shouldSendErrorEventOnLockAutoFocusCameraAccessException() + // throws CameraAccessException { + // when(mockCaptureSession.capture(any(), any(), any())) + // .thenThrow(new CameraAccessException(0, "")); + // camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); + // verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); + // } + + // @Test + // public void setFocusMode_shouldCallErrorOnResultOnCameraAccessException() + // throws CameraAccessException { + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + // .thenThrow(new CameraAccessException(0, "")); + + // camera.setFocusMode(mockResult, FocusMode.locked); + + // verify(mockResult, never()).success(any()); + // verify(mockResult, times(1)) + // .error("setFocusModeFailed", "Error setting focus mode: null", null); + // } + + // @Test + // public void setExposureOffset_shouldUpdateExposureOffsetFeature() { + // ExposureOffsetFeature mockExposureOffsetFeature = + // mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + // when(mockExposureOffsetFeature.getValue()).thenReturn(1.0); + + // camera.setExposureOffset(mockResult, 1.0); + + // verify(mockExposureOffsetFeature, times(1)).setValue(1.0); + // verify(mockResult, never()).error(any(), any(), any()); + // verify(mockResult, times(1)).success(1.0); + // } + + // @Test + // public void setExposureOffset_shouldAndUpdateBuilder() { + // ExposureOffsetFeature mockExposureOffsetFeature = + // mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + // camera.setExposureOffset(mockResult, 1.0); + + // verify(mockExposureOffsetFeature, times(1)).updateBuilder(any()); + // } + + // @Test + // public void setExposureOffset_shouldCallErrorOnResultOnCameraAccessException() + // throws CameraAccessException { + // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + // .thenThrow(new CameraAccessException(0, "")); + + // camera.setExposureOffset(mockResult, 1.0); + + // verify(mockResult, never()).success(any()); + // verify(mockResult, times(1)) + // .error("setExposureOffsetFailed", "Could not set exposure offset.", null); + // } + + // @Test + // public void lockCaptureOrientation_shouldLockCaptureOrientation() { + // final Activity mockActivity = mock(Activity.class); + // SensorOrientationFeature mockSensorOrientationFeature = + // mockCameraFeatureFactory.createSensorOrientationFeature( + // mockCameraProperties, mockActivity, mockDartMessenger); + + // camera.lockCaptureOrientation(PlatformChannel.DeviceOrientation.PORTRAIT_UP); + + // verify(mockSensorOrientationFeature, times(1)) + // .lockCaptureOrientation(PlatformChannel.DeviceOrientation.PORTRAIT_UP); + // } + + // @Test + // public void unlockCaptureOrientation_shouldUnlockCaptureOrientation() { + // final Activity mockActivity = mock(Activity.class); + // SensorOrientationFeature mockSensorOrientationFeature = + // mockCameraFeatureFactory.createSensorOrientationFeature( + // mockCameraProperties, mockActivity, mockDartMessenger); + + // camera.unlockCaptureOrientation(); + + // verify(mockSensorOrientationFeature, times(1)).unlockCaptureOrientation(); + // } + + // @Test + // public void pausePreview_shouldPausePreview() throws CameraAccessException { + // camera.pausePreview(); + + // assertEquals(TestUtils.getPrivateField(camera, "pausedPreview"), true); + // verify(mockCaptureSession, times(1)).stopRepeating(); + // } + + // @Test + // public void resumePreview_shouldResumePreview() throws CameraAccessException { + // camera.resumePreview(); + + // assertEquals(TestUtils.getPrivateField(camera, "pausedPreview"), false); + // verify(mockCaptureSession, times(1)).setRepeatingRequest(any(), any(), any()); + // } + + // @Test + // public void resumePreview_shouldSendErrorEventOnCameraAccessException() + // throws CameraAccessException { + // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + // .thenThrow(new CameraAccessException(0)); + + // camera.resumePreview(); + + // verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); + // } + + // @Test + // public void startBackgroundThread_shouldStartNewThread() { + // camera.startBackgroundThread(); + + // verify(mockHandlerThread, times(1)).start(); + // assertEquals(mockHandler, TestUtils.getPrivateField(camera, "backgroundHandler")); + // } + + // @Test + // public void startBackgroundThread_shouldNotStartNewThreadWhenAlreadyCreated() { + // camera.startBackgroundThread(); + // camera.startBackgroundThread(); + + // verify(mockHandlerThread, times(1)).start(); + // } + + // @Test + // public void stopBackgroundThread_quitsSafely() throws InterruptedException { + // camera.startBackgroundThread(); + // camera.stopBackgroundThread(); + + // verify(mockHandlerThread).quitSafely(); + // verify(mockHandlerThread, never()).join(); + // } + + // @Test + // public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAccessException { + // ArrayList mockRequestBuilders = new ArrayList<>(); + // mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + // CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); + // // Stub out other features used by the flow. + // TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + // TestUtils.setPrivateField(camera, "pictureImageReader", mock(ImageReader.class)); + // SensorOrientationFeature mockSensorOrientationFeature = + // mockCameraFeatureFactory.createSensorOrientationFeature(mockCameraProperties, null, null); + // DeviceOrientationManager mockDeviceOrientationManager = mock(DeviceOrientationManager.class); + // when(mockSensorOrientationFeature.getDeviceOrientationManager()) + // .thenReturn(mockDeviceOrientationManager); + + // // Simulate a post-precapture flow. + // camera.onConverged(); + // // A picture should be taken. + // verify(mockCaptureSession, times(1)).capture(any(), any(), any()); + // // The session shuold not be aborted as part of this flow, as this breaks capture on some + // // devices, and causes delays on others. + // verify(mockCaptureSession, never()).abortCaptures(); + // } + + // @Test + // public void createCaptureSession_doesNotCloseCaptureSession() throws CameraAccessException { + // Surface mockSurface = mock(Surface.class); + // SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); + // ResolutionFeature mockResolutionFeature = mock(ResolutionFeature.class); + // Size mockSize = mock(Size.class); + // ArrayList mockRequestBuilders = new ArrayList<>(); + // mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + // CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); + // TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + + // TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = + // (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); + // CameraFeatures cameraFeatures = + // (CameraFeatures) TestUtils.getPrivateField(camera, "cameraFeatures"); + // ResolutionFeature resolutionFeature = + // (ResolutionFeature) + // TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + + // when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); + // when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); + + // camera.createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, mockSurface); + + // verify(mockCaptureSession, never()).close(); + // } @Test public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest() @@ -1111,7 +1098,7 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); - when(fakeCamera.createCaptureRequest(any())).thenReturn(mockPreviewRequestBuilder); + when(fakeCamera.createCaptureRequest(any(Integer.class))).thenReturn(mockPreviewRequestBuilder); when(mockPictureImageReader.getSurface()).thenReturn(mockSurface); // Test with preview template, which should exclude any other surface. @@ -1124,24 +1111,24 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest verify(mockPreviewRequestBuilder).addTarget(mockSecondarySurface); } - @Test - public void close_doesCloseCaptureSessionWhenCameraDeviceNull() { - camera.close(); + // @Test + // public void close_doesCloseCaptureSessionWhenCameraDeviceNull() { + // camera.close(); - verify(mockCaptureSession).close(); - } + // verify(mockCaptureSession).close(); + // } - @Test - public void close_doesNotCloseCaptureSessionWhenCameraDeviceNonNull() { - ArrayList mockRequestBuilders = new ArrayList<>(); - mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); - CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + // @Test + // public void close_doesNotCloseCaptureSessionWhenCameraDeviceNonNull() { + // ArrayList mockRequestBuilders = new ArrayList<>(); + // mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + // CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); + // TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); - camera.close(); + // camera.close(); - verify(mockCaptureSession, never()).close(); - } + // verify(mockCaptureSession, never()).close(); + // } private static class TestCameraFeatureFactory implements CameraFeatureFactory { private final AutoFocusFeature mockAutoFocusFeature; From 73168b5d909268f16e42e49d44fdecf1c9b07827 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 09:05:52 -0700 Subject: [PATCH 08/28] Add fix for invalid use of matchers --- .../main/java/io/flutter/plugins/camera/Camera.java | 1 + .../java/io/flutter/plugins/camera/CameraTest.java | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java index 88a69bf4b70a..e6d012b85531 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -535,6 +535,7 @@ void refreshPreviewCaptureSession( } private void startCapture(boolean record, boolean stream) throws CameraAccessException { + System.out.println("DEBUG NOTE: made it to start capture"); List surfaces = new ArrayList<>(); Runnable successCallback = null; if (record) { diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 951201b60f79..c1e5e4d7a32e 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -5,8 +5,10 @@ package io.flutter.plugins.camera; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -1082,7 +1084,7 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest Size mockSize = mock(Size.class); ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); - CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); + CameraDeviceWrapper fakeCamera = spy(new FakeCameraDeviceWrapper(mockRequestBuilders)); ImageReader mockPictureImageReader = mock(ImageReader.class); TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); @@ -1098,12 +1100,12 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); - when(fakeCamera.createCaptureRequest(any(Integer.class))).thenReturn(mockPreviewRequestBuilder); + when(fakeCamera.createCaptureRequest(anyInt())).thenReturn(mockPreviewRequestBuilder); when(mockPictureImageReader.getSurface()).thenReturn(mockSurface); - // Test with preview template, which should exclude any other surface. + // Test with preview template. camera.createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, mockSurface, mockSecondarySurface); - verify(mockPreviewRequestBuilder, times(0)).addTarget(any(Surface.class)); + verify(mockPreviewRequestBuilder, times(0)).addTarget(mockSurface); // Test with non-preview template. camera.createCaptureSession(CameraDevice.TEMPLATE_RECORD, mockSurface, mockSecondarySurface); From 69d7ffeb52af95f675198baa569f5fac8cab63fd Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 09:20:11 -0700 Subject: [PATCH 09/28] add debug notes --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java index e6d012b85531..c9acb07608bc 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -535,7 +535,6 @@ void refreshPreviewCaptureSession( } private void startCapture(boolean record, boolean stream) throws CameraAccessException { - System.out.println("DEBUG NOTE: made it to start capture"); List surfaces = new ArrayList<>(); Runnable successCallback = null; if (record) { @@ -763,12 +762,15 @@ void unlockAutoFocus() { public void startVideoRecording( @NonNull Result result, @Nullable EventChannel imageStreamChannel) { + System.out.println("DEBUG NOTE: made it to start video recording"); prepareRecording(result); - + System.out.println("DEBUG NOTE: properly prepared recording"); if (imageStreamChannel != null) { setStreamHandler(imageStreamChannel); } + System.out.println("DEBUG NOTE: properly handled imageStreamChannel"); initialCameraFacing = cameraProperties.getLensFacing(); + System.out.println("DEBUG NOTEgot past lens facing"); recordingVideo = true; try { startCapture(true, imageStreamChannel != null); From 30a888069a84a66d5f604e4df6a5f4879321c63b Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 09:23:59 -0700 Subject: [PATCH 10/28] Bump version --- packages/camera/camera_android/CHANGELOG.md | 3 ++- packages/camera/camera_android/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index c853b8a4b1be..6c6746414ef9 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,7 +1,8 @@ -## NEXT +## 0.10.8+3 * Fixes unawaited_futures violations. * Removes duplicate line in `MediaRecorderBuilder.java`. +* Adds support for concurrently capturing images and image streaming/recording. ## 0.10.8+2 diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 9da632825dd4..7a7251201c34 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -3,7 +3,7 @@ description: Android implementation of the camera plugin. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.10.8+2 +version: 0.10.8+3 environment: sdk: ">=2.18.0 <4.0.0" From 3abad3b3d255054d55d3cccc33ae27edecd45a4f Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 09:39:05 -0700 Subject: [PATCH 11/28] Mock prepareMediaRecorder --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 7 ++----- .../test/java/io/flutter/plugins/camera/CameraTest.java | 6 +++++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java index c9acb07608bc..0c6fe2480cd8 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -243,7 +243,8 @@ void updateBuilderSettings(CaptureRequest.Builder requestBuilder) { } } - private void prepareMediaRecorder(String outputFilePath) throws IOException { + @VisibleForTesting + void prepareMediaRecorder(String outputFilePath) throws IOException { Log.i(TAG, "prepareMediaRecorder"); if (mediaRecorder != null) { @@ -762,15 +763,11 @@ void unlockAutoFocus() { public void startVideoRecording( @NonNull Result result, @Nullable EventChannel imageStreamChannel) { - System.out.println("DEBUG NOTE: made it to start video recording"); prepareRecording(result); - System.out.println("DEBUG NOTE: properly prepared recording"); if (imageStreamChannel != null) { setStreamHandler(imageStreamChannel); } - System.out.println("DEBUG NOTE: properly handled imageStreamChannel"); initialCameraFacing = cameraProperties.getLensFacing(); - System.out.println("DEBUG NOTEgot past lens facing"); recordingVideo = true; try { startCapture(true, imageStreamChannel != null); diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index c1e5e4d7a32e..a60f4984d0f7 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -6,6 +6,8 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.spy; @@ -50,6 +52,7 @@ import io.flutter.plugins.camera.utils.TestUtils; import io.flutter.view.TextureRegistry; import java.util.ArrayList; +import java.io.IOException; import java.util.List; import org.junit.After; import org.junit.Before; @@ -836,7 +839,7 @@ public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() @Test public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader() - throws InterruptedException, CameraAccessException { + throws InterruptedException, IOException, CameraAccessException { ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); @@ -859,6 +862,7 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(mockMediaRecorder.getSurface()).thenReturn(mock(Surface.class)); when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); + doNothing().when(camera).prepareMediaRecorder(anyString()); camera.startVideoRecording(mock(MethodChannel.Result.class), null); verify(mockMediaRecorder, times(1)) From 9e44f56b716bd698a6653874ac5a1b35893bbd10 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 09:50:49 -0700 Subject: [PATCH 12/28] Change camera to spy for mock --- .../io/flutter/plugins/camera/CameraTest.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index a60f4984d0f7..aeaf686efba8 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -840,20 +840,21 @@ public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() @Test public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader() throws InterruptedException, IOException, CameraAccessException { + Camera cameraSpy = spy(camera); ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); Size mockSize = mock(Size.class); MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); ImageReader mockPictureImageReader = mock(ImageReader.class); - TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - TestUtils.setPrivateField(camera, "recordingVideo", false); - TestUtils.setPrivateField(camera, "pictureImageReader", mockPictureImageReader); + TestUtils.setPrivateField(cameraSpy, "mediaRecorder", mockMediaRecorder); + TestUtils.setPrivateField(cameraSpy, "recordingVideo", false); + TestUtils.setPrivateField(cameraSpy, "pictureImageReader", mockPictureImageReader); CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + TestUtils.setPrivateField(cameraSpy, "cameraDevice", fakeCamera); TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = - (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); + (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(cameraSpy, "flutterTexture"); ResolutionFeature resolutionFeature = (ResolutionFeature) TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); @@ -862,9 +863,9 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(mockMediaRecorder.getSurface()).thenReturn(mock(Surface.class)); when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); - doNothing().when(camera).prepareMediaRecorder(anyString()); + doNothing().when(cameraSpy).prepareMediaRecorder(anyString()); - camera.startVideoRecording(mock(MethodChannel.Result.class), null); + cameraSpy.startVideoRecording(mock(MethodChannel.Result.class), null); verify(mockMediaRecorder, times(1)) .getSurface(); // stream pulled from media recorder's surface. verify(mockPictureImageReader, times(1)) From 22ebff067fedd6e60c400e6f3490f812c20fcb52 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 10:03:35 -0700 Subject: [PATCH 13/28] Mock prepareRecording --- .../main/java/io/flutter/plugins/camera/Camera.java | 7 ++++--- .../java/io/flutter/plugins/camera/CameraTest.java | 10 ++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java index 0c6fe2480cd8..e96de93918b6 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -243,8 +243,7 @@ void updateBuilderSettings(CaptureRequest.Builder requestBuilder) { } } - @VisibleForTesting - void prepareMediaRecorder(String outputFilePath) throws IOException { + private void prepareMediaRecorder(String outputFilePath) throws IOException { Log.i(TAG, "prepareMediaRecorder"); if (mediaRecorder != null) { @@ -764,6 +763,7 @@ void unlockAutoFocus() { public void startVideoRecording( @NonNull Result result, @Nullable EventChannel imageStreamChannel) { prepareRecording(result); + if (imageStreamChannel != null) { setStreamHandler(imageStreamChannel); } @@ -1173,7 +1173,8 @@ public void onError(String errorCode, String errorMessage) { cameraCaptureCallback.setCameraState(CameraState.STATE_PREVIEW); } - private void prepareRecording(@NonNull Result result) { + @VisibleForTesting + void prepareRecording(@NonNull Result result) { final File outputDir = applicationContext.getCacheDir(); try { captureFile = File.createTempFile("REC", ".mp4", outputDir); diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index aeaf686efba8..b0303d7ea2a2 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -51,8 +51,8 @@ import io.flutter.plugins.camera.media.ImageStreamReader; import io.flutter.plugins.camera.utils.TestUtils; import io.flutter.view.TextureRegistry; -import java.util.ArrayList; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import org.junit.After; import org.junit.Before; @@ -852,9 +852,11 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader TestUtils.setPrivateField(cameraSpy, "pictureImageReader", mockPictureImageReader); CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); TestUtils.setPrivateField(cameraSpy, "cameraDevice", fakeCamera); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = - (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(cameraSpy, "flutterTexture"); + (TextureRegistry.SurfaceTextureEntry) + TestUtils.getPrivateField(cameraSpy, "flutterTexture"); ResolutionFeature resolutionFeature = (ResolutionFeature) TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); @@ -863,9 +865,9 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(mockMediaRecorder.getSurface()).thenReturn(mock(Surface.class)); when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); - doNothing().when(cameraSpy).prepareMediaRecorder(anyString()); + doNothing().when(cameraSpy).prepareRecording(mockResult); - cameraSpy.startVideoRecording(mock(MethodChannel.Result.class), null); + cameraSpy.startVideoRecording(mockResult, null); verify(mockMediaRecorder, times(1)) .getSurface(); // stream pulled from media recorder's surface. verify(mockPictureImageReader, times(1)) From 7d39d57629528cb86a5c3e1a3e3290ca0ab33bc1 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 10:13:15 -0700 Subject: [PATCH 14/28] Bump times because createCaptureSession --- .../src/test/java/io/flutter/plugins/camera/CameraTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index b0303d7ea2a2..3601532dae3c 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -6,7 +6,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; @@ -870,7 +869,7 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader cameraSpy.startVideoRecording(mockResult, null); verify(mockMediaRecorder, times(1)) .getSurface(); // stream pulled from media recorder's surface. - verify(mockPictureImageReader, times(1)) + verify(mockPictureImageReader, times(2)) .getSurface(); // stream pulled from image streaming imageReader's surface. } From 48177def13be65430b531f599e2969afcb33d5f5 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 10:26:04 -0700 Subject: [PATCH 15/28] Bump times because createCaptureSession --- .../src/test/java/io/flutter/plugins/camera/CameraTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 3601532dae3c..48effe4f5be1 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -869,7 +869,7 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader cameraSpy.startVideoRecording(mockResult, null); verify(mockMediaRecorder, times(1)) .getSurface(); // stream pulled from media recorder's surface. - verify(mockPictureImageReader, times(2)) + verify(mockPictureImageReader, times(3)) .getSurface(); // stream pulled from image streaming imageReader's surface. } From 6f9e0851ec1d37107810a5855ea8c70dd3e5f3a6 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 10:47:01 -0700 Subject: [PATCH 16/28] Uncomment other tests, add comments --- .../io/flutter/plugins/camera/CameraTest.java | 1596 +++++++++-------- 1 file changed, 800 insertions(+), 796 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 48effe4f5be1..739608716aad 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -142,482 +142,482 @@ public void after() { mockHandlerFactory.close(); } - // @Test - // public void shouldNotImplementLifecycleObserverInterface() { - // Class cameraClass = Camera.class; - - // assertFalse(LifecycleObserver.class.isAssignableFrom(cameraClass)); - // } - - // @Test - // public void shouldCreateCameraPluginAndSetAllFeatures() { - // final Activity mockActivity = mock(Activity.class); - // final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = - // mock(TextureRegistry.SurfaceTextureEntry.class); - // final CameraFeatureFactory mockCameraFeatureFactory = mock(CameraFeatureFactory.class); - // final String cameraName = "1"; - // final ResolutionPreset resolutionPreset = ResolutionPreset.high; - // final boolean enableAudio = false; - - // when(mockCameraProperties.getCameraName()).thenReturn(cameraName); - // SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); - // when(mockCameraFeatureFactory.createSensorOrientationFeature(any(), any(), any())) - // .thenReturn(mockSensorOrientationFeature); - - // Camera camera = - // new Camera( - // mockActivity, - // mockFlutterTexture, - // mockCameraFeatureFactory, - // mockDartMessenger, - // mockCameraProperties, - // resolutionPreset, - // enableAudio); - - // verify(mockCameraFeatureFactory, times(1)) - // .createSensorOrientationFeature(mockCameraProperties, mockActivity, mockDartMessenger); - // verify(mockCameraFeatureFactory, times(1)).createAutoFocusFeature(mockCameraProperties, false); - // verify(mockCameraFeatureFactory, times(1)).createExposureLockFeature(mockCameraProperties); - // verify(mockCameraFeatureFactory, times(1)) - // .createExposurePointFeature(eq(mockCameraProperties), eq(mockSensorOrientationFeature)); - // verify(mockCameraFeatureFactory, times(1)).createExposureOffsetFeature(mockCameraProperties); - // verify(mockCameraFeatureFactory, times(1)).createFlashFeature(mockCameraProperties); - // verify(mockCameraFeatureFactory, times(1)) - // .createFocusPointFeature(eq(mockCameraProperties), eq(mockSensorOrientationFeature)); - // verify(mockCameraFeatureFactory, times(1)).createFpsRangeFeature(mockCameraProperties); - // verify(mockCameraFeatureFactory, times(1)).createNoiseReductionFeature(mockCameraProperties); - // verify(mockCameraFeatureFactory, times(1)) - // .createResolutionFeature(mockCameraProperties, resolutionPreset, cameraName); - // verify(mockCameraFeatureFactory, times(1)).createZoomLevelFeature(mockCameraProperties); - // assertNotNull("should create a camera", camera); - // } - - // @Test - // public void getDeviceOrientationManager() { - // SensorOrientationFeature mockSensorOrientationFeature = - // mockCameraFeatureFactory.createSensorOrientationFeature(mockCameraProperties, null, null); - // DeviceOrientationManager mockDeviceOrientationManager = mock(DeviceOrientationManager.class); - - // when(mockSensorOrientationFeature.getDeviceOrientationManager()) - // .thenReturn(mockDeviceOrientationManager); - - // DeviceOrientationManager actualDeviceOrientationManager = camera.getDeviceOrientationManager(); - - // verify(mockSensorOrientationFeature, times(1)).getDeviceOrientationManager(); - // assertEquals(mockDeviceOrientationManager, actualDeviceOrientationManager); - // } - - // @Test - // public void getExposureOffsetStepSize() { - // ExposureOffsetFeature mockExposureOffsetFeature = - // mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); - // double stepSize = 2.3; - - // when(mockExposureOffsetFeature.getExposureOffsetStepSize()).thenReturn(stepSize); - - // double actualSize = camera.getExposureOffsetStepSize(); - - // verify(mockExposureOffsetFeature, times(1)).getExposureOffsetStepSize(); - // assertEquals(stepSize, actualSize, 0); - // } - - // @Test - // public void getMaxExposureOffset() { - // ExposureOffsetFeature mockExposureOffsetFeature = - // mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); - // double expectedMaxOffset = 42.0; - - // when(mockExposureOffsetFeature.getMaxExposureOffset()).thenReturn(expectedMaxOffset); - - // double actualMaxOffset = camera.getMaxExposureOffset(); - - // verify(mockExposureOffsetFeature, times(1)).getMaxExposureOffset(); - // assertEquals(expectedMaxOffset, actualMaxOffset, 0); - // } - - // @Test - // public void getMinExposureOffset() { - // ExposureOffsetFeature mockExposureOffsetFeature = - // mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); - // double expectedMinOffset = 21.5; - - // when(mockExposureOffsetFeature.getMinExposureOffset()).thenReturn(21.5); - - // double actualMinOffset = camera.getMinExposureOffset(); - - // verify(mockExposureOffsetFeature, times(1)).getMinExposureOffset(); - // assertEquals(expectedMinOffset, actualMinOffset, 0); - // } - - // @Test - // public void getMaxZoomLevel() { - // ZoomLevelFeature mockZoomLevelFeature = - // mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); - // float expectedMaxZoomLevel = 4.2f; - - // when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(expectedMaxZoomLevel); - - // float actualMaxZoomLevel = camera.getMaxZoomLevel(); - - // verify(mockZoomLevelFeature, times(1)).getMaximumZoomLevel(); - // assertEquals(expectedMaxZoomLevel, actualMaxZoomLevel, 0); - // } - - // @Test - // public void getMinZoomLevel() { - // ZoomLevelFeature mockZoomLevelFeature = - // mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); - // float expectedMinZoomLevel = 4.2f; - - // when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(expectedMinZoomLevel); - - // float actualMinZoomLevel = camera.getMinZoomLevel(); - - // verify(mockZoomLevelFeature, times(1)).getMinimumZoomLevel(); - // assertEquals(expectedMinZoomLevel, actualMinZoomLevel, 0); - // } - - // @Test - // public void setExposureMode_shouldUpdateExposureLockFeature() { - // ExposureLockFeature mockExposureLockFeature = - // mockCameraFeatureFactory.createExposureLockFeature(mockCameraProperties); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // ExposureMode exposureMode = ExposureMode.locked; - - // camera.setExposureMode(mockResult, exposureMode); - - // verify(mockExposureLockFeature, times(1)).setValue(exposureMode); - // verify(mockResult, never()).error(any(), any(), any()); - // verify(mockResult, times(1)).success(null); - // } - - // @Test - // public void setExposureMode_shouldUpdateBuilder() { - // ExposureLockFeature mockExposureLockFeature = - // mockCameraFeatureFactory.createExposureLockFeature(mockCameraProperties); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // ExposureMode exposureMode = ExposureMode.locked; - - // camera.setExposureMode(mockResult, exposureMode); - - // verify(mockExposureLockFeature, times(1)).updateBuilder(any()); - // } - - // @Test - // public void setExposureMode_shouldCallErrorOnResultOnCameraAccessException() - // throws CameraAccessException { - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // ExposureMode exposureMode = ExposureMode.locked; - // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - // .thenThrow(new CameraAccessException(0, "")); - - // camera.setExposureMode(mockResult, exposureMode); - - // verify(mockResult, never()).success(any()); - // verify(mockResult, times(1)) - // .error("setExposureModeFailed", "Could not set exposure mode.", null); - // } - - // @Test - // public void setExposurePoint_shouldUpdateExposurePointFeature() { - // SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); - // ExposurePointFeature mockExposurePointFeature = - // mockCameraFeatureFactory.createExposurePointFeature( - // mockCameraProperties, mockSensorOrientationFeature); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // Point point = new Point(42d, 42d); - - // camera.setExposurePoint(mockResult, point); - - // verify(mockExposurePointFeature, times(1)).setValue(point); - // verify(mockResult, never()).error(any(), any(), any()); - // verify(mockResult, times(1)).success(null); - // } - - // @Test - // public void setExposurePoint_shouldUpdateBuilder() { - // SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); - // ExposurePointFeature mockExposurePointFeature = - // mockCameraFeatureFactory.createExposurePointFeature( - // mockCameraProperties, mockSensorOrientationFeature); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // Point point = new Point(42d, 42d); - - // camera.setExposurePoint(mockResult, point); - - // verify(mockExposurePointFeature, times(1)).updateBuilder(any()); - // } - - // @Test - // public void setExposurePoint_shouldCallErrorOnResultOnCameraAccessException() - // throws CameraAccessException { - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // Point point = new Point(42d, 42d); - // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - // .thenThrow(new CameraAccessException(0, "")); - - // camera.setExposurePoint(mockResult, point); - - // verify(mockResult, never()).success(any()); - // verify(mockResult, times(1)) - // .error("setExposurePointFailed", "Could not set exposure point.", null); - // } - - // @Test - // public void setFlashMode_shouldUpdateFlashFeature() { - // FlashFeature mockFlashFeature = - // mockCameraFeatureFactory.createFlashFeature(mockCameraProperties); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // FlashMode flashMode = FlashMode.always; - - // camera.setFlashMode(mockResult, flashMode); - - // verify(mockFlashFeature, times(1)).setValue(flashMode); - // verify(mockResult, never()).error(any(), any(), any()); - // verify(mockResult, times(1)).success(null); - // } - - // @Test - // public void setFlashMode_shouldUpdateBuilder() { - // FlashFeature mockFlashFeature = - // mockCameraFeatureFactory.createFlashFeature(mockCameraProperties); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // FlashMode flashMode = FlashMode.always; - - // camera.setFlashMode(mockResult, flashMode); - - // verify(mockFlashFeature, times(1)).updateBuilder(any()); - // } - - // @Test - // public void setFlashMode_shouldCallErrorOnResultOnCameraAccessException() - // throws CameraAccessException { - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // FlashMode flashMode = FlashMode.always; - // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - // .thenThrow(new CameraAccessException(0, "")); - - // camera.setFlashMode(mockResult, flashMode); - - // verify(mockResult, never()).success(any()); - // verify(mockResult, times(1)).error("setFlashModeFailed", "Could not set flash mode.", null); - // } - - // @Test - // public void setFocusPoint_shouldUpdateFocusPointFeature() { - // SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); - // FocusPointFeature mockFocusPointFeature = - // mockCameraFeatureFactory.createFocusPointFeature( - // mockCameraProperties, mockSensorOrientationFeature); - // AutoFocusFeature mockAutoFocusFeature = - // mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // Point point = new Point(42d, 42d); - // when(mockAutoFocusFeature.getValue()).thenReturn(FocusMode.auto); - - // camera.setFocusPoint(mockResult, point); - - // verify(mockFocusPointFeature, times(1)).setValue(point); - // verify(mockResult, never()).error(any(), any(), any()); - // verify(mockResult, times(1)).success(null); - // } - - // @Test - // public void setFocusPoint_shouldUpdateBuilder() { - // SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); - // FocusPointFeature mockFocusPointFeature = - // mockCameraFeatureFactory.createFocusPointFeature( - // mockCameraProperties, mockSensorOrientationFeature); - // AutoFocusFeature mockAutoFocusFeature = - // mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // Point point = new Point(42d, 42d); - // when(mockAutoFocusFeature.getValue()).thenReturn(FocusMode.auto); - - // camera.setFocusPoint(mockResult, point); - - // verify(mockFocusPointFeature, times(1)).updateBuilder(any()); - // } - - // @Test - // public void setFocusPoint_shouldCallErrorOnResultOnCameraAccessException() - // throws CameraAccessException { - // AutoFocusFeature mockAutoFocusFeature = - // mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // Point point = new Point(42d, 42d); - // when(mockAutoFocusFeature.getValue()).thenReturn(FocusMode.auto); - // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - // .thenThrow(new CameraAccessException(0, "")); - - // camera.setFocusPoint(mockResult, point); - - // verify(mockResult, never()).success(any()); - // verify(mockResult, times(1)).error("setFocusPointFailed", "Could not set focus point.", null); - // } - - // @Test - // public void setZoomLevel_shouldUpdateZoomLevelFeature() throws CameraAccessException { - // ZoomLevelFeature mockZoomLevelFeature = - // mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // float zoomLevel = 1.0f; - - // when(mockZoomLevelFeature.getValue()).thenReturn(zoomLevel); - // when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(0f); - // when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(2f); - - // camera.setZoomLevel(mockResult, zoomLevel); - - // verify(mockZoomLevelFeature, times(1)).setValue(zoomLevel); - // verify(mockResult, never()).error(any(), any(), any()); - // verify(mockResult, times(1)).success(null); - // } - - // @Test - // public void setZoomLevel_shouldUpdateBuilder() throws CameraAccessException { - // ZoomLevelFeature mockZoomLevelFeature = - // mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // float zoomLevel = 1.0f; - - // when(mockZoomLevelFeature.getValue()).thenReturn(zoomLevel); - // when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(0f); - // when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(2f); - - // camera.setZoomLevel(mockResult, zoomLevel); - - // verify(mockZoomLevelFeature, times(1)).updateBuilder(any()); - // } - - // @Test - // public void setZoomLevel_shouldCallErrorOnResultOnCameraAccessException() - // throws CameraAccessException { - // ZoomLevelFeature mockZoomLevelFeature = - // mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // float zoomLevel = 1.0f; - - // when(mockZoomLevelFeature.getValue()).thenReturn(zoomLevel); - // when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(0f); - // when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(2f); - // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - // .thenThrow(new CameraAccessException(0, "")); - - // camera.setZoomLevel(mockResult, zoomLevel); - - // verify(mockResult, never()).success(any()); - // verify(mockResult, times(1)).error("setZoomLevelFailed", "Could not set zoom level.", null); - // } - - // @Test - // public void pauseVideoRecording_shouldSendNullResultWhenNotRecording() { - // TestUtils.setPrivateField(camera, "recordingVideo", false); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - // camera.pauseVideoRecording(mockResult); - - // verify(mockResult, times(1)).success(null); - // verify(mockResult, never()).error(any(), any(), any()); - // } - - // @Test - // public void pauseVideoRecording_shouldCallPauseWhenRecordingAndOnAPIN() { - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - // TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - // TestUtils.setPrivateField(camera, "recordingVideo", true); - // TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); - - // camera.pauseVideoRecording(mockResult); - - // verify(mockMediaRecorder, times(1)).pause(); - // verify(mockResult, times(1)).success(null); - // verify(mockResult, never()).error(any(), any(), any()); - // } - - // @Test - // public void pauseVideoRecording_shouldSendVideoRecordingFailedErrorWhenVersionCodeSmallerThenN() { - // TestUtils.setPrivateField(camera, "recordingVideo", true); - // TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 23); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - // camera.pauseVideoRecording(mockResult); - - // verify(mockResult, times(1)) - // .error("videoRecordingFailed", "pauseVideoRecording requires Android API +24.", null); - // verify(mockResult, never()).success(any()); - // } - - // @Test - // public void - // pauseVideoRecording_shouldSendVideoRecordingFailedErrorWhenMediaRecorderPauseThrowsIllegalStateException() { - // MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - // TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - // TestUtils.setPrivateField(camera, "recordingVideo", true); - // TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); - - // IllegalStateException expectedException = new IllegalStateException("Test error message"); - - // doThrow(expectedException).when(mockMediaRecorder).pause(); - - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - // camera.pauseVideoRecording(mockResult); - - // verify(mockResult, times(1)).error("videoRecordingFailed", "Test error message", null); - // verify(mockResult, never()).success(any()); - // } - - // @Test - // public void resumeVideoRecording_shouldSendNullResultWhenNotRecording() { - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // TestUtils.setPrivateField(camera, "recordingVideo", false); - - // camera.resumeVideoRecording(mockResult); - - // verify(mockResult, times(1)).success(null); - // verify(mockResult, never()).error(any(), any(), any()); - // } - - // @Test - // public void resumeVideoRecording_shouldCallPauseWhenRecordingAndOnAPIN() { - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - // TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - // TestUtils.setPrivateField(camera, "recordingVideo", true); - // TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); - - // camera.resumeVideoRecording(mockResult); - - // verify(mockMediaRecorder, times(1)).resume(); - // verify(mockResult, times(1)).success(null); - // verify(mockResult, never()).error(any(), any(), any()); - // } - - // @Test - // public void setDescriptionWhileRecording() { - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - // VideoRenderer mockVideoRenderer = mock(VideoRenderer.class); - // TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - // TestUtils.setPrivateField(camera, "recordingVideo", true); - // TestUtils.setPrivateField(camera, "videoRenderer", mockVideoRenderer); - - // final CameraProperties newCameraProperties = mock(CameraProperties.class); - // camera.setDescriptionWhileRecording(mockResult, newCameraProperties); - - // if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { - // verify(mockResult, times(1)) - // .error( - // eq("setDescriptionWhileRecordingFailed"), - // eq("Device does not support switching the camera while recording"), - // eq(null)); - // } else { - // verify(mockResult, times(1)).success(null); - // verify(mockResult, never()).error(any(), any(), any()); - // } - // } + @Test + public void shouldNotImplementLifecycleObserverInterface() { + Class cameraClass = Camera.class; + + assertFalse(LifecycleObserver.class.isAssignableFrom(cameraClass)); + } + + @Test + public void shouldCreateCameraPluginAndSetAllFeatures() { + final Activity mockActivity = mock(Activity.class); + final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = + mock(TextureRegistry.SurfaceTextureEntry.class); + final CameraFeatureFactory mockCameraFeatureFactory = mock(CameraFeatureFactory.class); + final String cameraName = "1"; + final ResolutionPreset resolutionPreset = ResolutionPreset.high; + final boolean enableAudio = false; + + when(mockCameraProperties.getCameraName()).thenReturn(cameraName); + SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); + when(mockCameraFeatureFactory.createSensorOrientationFeature(any(), any(), any())) + .thenReturn(mockSensorOrientationFeature); + + Camera camera = + new Camera( + mockActivity, + mockFlutterTexture, + mockCameraFeatureFactory, + mockDartMessenger, + mockCameraProperties, + resolutionPreset, + enableAudio); + + verify(mockCameraFeatureFactory, times(1)) + .createSensorOrientationFeature(mockCameraProperties, mockActivity, mockDartMessenger); + verify(mockCameraFeatureFactory, times(1)).createAutoFocusFeature(mockCameraProperties, false); + verify(mockCameraFeatureFactory, times(1)).createExposureLockFeature(mockCameraProperties); + verify(mockCameraFeatureFactory, times(1)) + .createExposurePointFeature(eq(mockCameraProperties), eq(mockSensorOrientationFeature)); + verify(mockCameraFeatureFactory, times(1)).createExposureOffsetFeature(mockCameraProperties); + verify(mockCameraFeatureFactory, times(1)).createFlashFeature(mockCameraProperties); + verify(mockCameraFeatureFactory, times(1)) + .createFocusPointFeature(eq(mockCameraProperties), eq(mockSensorOrientationFeature)); + verify(mockCameraFeatureFactory, times(1)).createFpsRangeFeature(mockCameraProperties); + verify(mockCameraFeatureFactory, times(1)).createNoiseReductionFeature(mockCameraProperties); + verify(mockCameraFeatureFactory, times(1)) + .createResolutionFeature(mockCameraProperties, resolutionPreset, cameraName); + verify(mockCameraFeatureFactory, times(1)).createZoomLevelFeature(mockCameraProperties); + assertNotNull("should create a camera", camera); + } + + @Test + public void getDeviceOrientationManager() { + SensorOrientationFeature mockSensorOrientationFeature = + mockCameraFeatureFactory.createSensorOrientationFeature(mockCameraProperties, null, null); + DeviceOrientationManager mockDeviceOrientationManager = mock(DeviceOrientationManager.class); + + when(mockSensorOrientationFeature.getDeviceOrientationManager()) + .thenReturn(mockDeviceOrientationManager); + + DeviceOrientationManager actualDeviceOrientationManager = camera.getDeviceOrientationManager(); + + verify(mockSensorOrientationFeature, times(1)).getDeviceOrientationManager(); + assertEquals(mockDeviceOrientationManager, actualDeviceOrientationManager); + } + + @Test + public void getExposureOffsetStepSize() { + ExposureOffsetFeature mockExposureOffsetFeature = + mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); + double stepSize = 2.3; + + when(mockExposureOffsetFeature.getExposureOffsetStepSize()).thenReturn(stepSize); + + double actualSize = camera.getExposureOffsetStepSize(); + + verify(mockExposureOffsetFeature, times(1)).getExposureOffsetStepSize(); + assertEquals(stepSize, actualSize, 0); + } + + @Test + public void getMaxExposureOffset() { + ExposureOffsetFeature mockExposureOffsetFeature = + mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); + double expectedMaxOffset = 42.0; + + when(mockExposureOffsetFeature.getMaxExposureOffset()).thenReturn(expectedMaxOffset); + + double actualMaxOffset = camera.getMaxExposureOffset(); + + verify(mockExposureOffsetFeature, times(1)).getMaxExposureOffset(); + assertEquals(expectedMaxOffset, actualMaxOffset, 0); + } + + @Test + public void getMinExposureOffset() { + ExposureOffsetFeature mockExposureOffsetFeature = + mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); + double expectedMinOffset = 21.5; + + when(mockExposureOffsetFeature.getMinExposureOffset()).thenReturn(21.5); + + double actualMinOffset = camera.getMinExposureOffset(); + + verify(mockExposureOffsetFeature, times(1)).getMinExposureOffset(); + assertEquals(expectedMinOffset, actualMinOffset, 0); + } + + @Test + public void getMaxZoomLevel() { + ZoomLevelFeature mockZoomLevelFeature = + mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); + float expectedMaxZoomLevel = 4.2f; + + when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(expectedMaxZoomLevel); + + float actualMaxZoomLevel = camera.getMaxZoomLevel(); + + verify(mockZoomLevelFeature, times(1)).getMaximumZoomLevel(); + assertEquals(expectedMaxZoomLevel, actualMaxZoomLevel, 0); + } + + @Test + public void getMinZoomLevel() { + ZoomLevelFeature mockZoomLevelFeature = + mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); + float expectedMinZoomLevel = 4.2f; + + when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(expectedMinZoomLevel); + + float actualMinZoomLevel = camera.getMinZoomLevel(); + + verify(mockZoomLevelFeature, times(1)).getMinimumZoomLevel(); + assertEquals(expectedMinZoomLevel, actualMinZoomLevel, 0); + } + + @Test + public void setExposureMode_shouldUpdateExposureLockFeature() { + ExposureLockFeature mockExposureLockFeature = + mockCameraFeatureFactory.createExposureLockFeature(mockCameraProperties); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + ExposureMode exposureMode = ExposureMode.locked; + + camera.setExposureMode(mockResult, exposureMode); + + verify(mockExposureLockFeature, times(1)).setValue(exposureMode); + verify(mockResult, never()).error(any(), any(), any()); + verify(mockResult, times(1)).success(null); + } + + @Test + public void setExposureMode_shouldUpdateBuilder() { + ExposureLockFeature mockExposureLockFeature = + mockCameraFeatureFactory.createExposureLockFeature(mockCameraProperties); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + ExposureMode exposureMode = ExposureMode.locked; + + camera.setExposureMode(mockResult, exposureMode); + + verify(mockExposureLockFeature, times(1)).updateBuilder(any()); + } + + @Test + public void setExposureMode_shouldCallErrorOnResultOnCameraAccessException() + throws CameraAccessException { + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + ExposureMode exposureMode = ExposureMode.locked; + when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + .thenThrow(new CameraAccessException(0, "")); + + camera.setExposureMode(mockResult, exposureMode); + + verify(mockResult, never()).success(any()); + verify(mockResult, times(1)) + .error("setExposureModeFailed", "Could not set exposure mode.", null); + } + + @Test + public void setExposurePoint_shouldUpdateExposurePointFeature() { + SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); + ExposurePointFeature mockExposurePointFeature = + mockCameraFeatureFactory.createExposurePointFeature( + mockCameraProperties, mockSensorOrientationFeature); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + Point point = new Point(42d, 42d); + + camera.setExposurePoint(mockResult, point); + + verify(mockExposurePointFeature, times(1)).setValue(point); + verify(mockResult, never()).error(any(), any(), any()); + verify(mockResult, times(1)).success(null); + } + + @Test + public void setExposurePoint_shouldUpdateBuilder() { + SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); + ExposurePointFeature mockExposurePointFeature = + mockCameraFeatureFactory.createExposurePointFeature( + mockCameraProperties, mockSensorOrientationFeature); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + Point point = new Point(42d, 42d); + + camera.setExposurePoint(mockResult, point); + + verify(mockExposurePointFeature, times(1)).updateBuilder(any()); + } + + @Test + public void setExposurePoint_shouldCallErrorOnResultOnCameraAccessException() + throws CameraAccessException { + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + Point point = new Point(42d, 42d); + when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + .thenThrow(new CameraAccessException(0, "")); + + camera.setExposurePoint(mockResult, point); + + verify(mockResult, never()).success(any()); + verify(mockResult, times(1)) + .error("setExposurePointFailed", "Could not set exposure point.", null); + } + + @Test + public void setFlashMode_shouldUpdateFlashFeature() { + FlashFeature mockFlashFeature = + mockCameraFeatureFactory.createFlashFeature(mockCameraProperties); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + FlashMode flashMode = FlashMode.always; + + camera.setFlashMode(mockResult, flashMode); + + verify(mockFlashFeature, times(1)).setValue(flashMode); + verify(mockResult, never()).error(any(), any(), any()); + verify(mockResult, times(1)).success(null); + } + + @Test + public void setFlashMode_shouldUpdateBuilder() { + FlashFeature mockFlashFeature = + mockCameraFeatureFactory.createFlashFeature(mockCameraProperties); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + FlashMode flashMode = FlashMode.always; + + camera.setFlashMode(mockResult, flashMode); + + verify(mockFlashFeature, times(1)).updateBuilder(any()); + } + + @Test + public void setFlashMode_shouldCallErrorOnResultOnCameraAccessException() + throws CameraAccessException { + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + FlashMode flashMode = FlashMode.always; + when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + .thenThrow(new CameraAccessException(0, "")); + + camera.setFlashMode(mockResult, flashMode); + + verify(mockResult, never()).success(any()); + verify(mockResult, times(1)).error("setFlashModeFailed", "Could not set flash mode.", null); + } + + @Test + public void setFocusPoint_shouldUpdateFocusPointFeature() { + SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); + FocusPointFeature mockFocusPointFeature = + mockCameraFeatureFactory.createFocusPointFeature( + mockCameraProperties, mockSensorOrientationFeature); + AutoFocusFeature mockAutoFocusFeature = + mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + Point point = new Point(42d, 42d); + when(mockAutoFocusFeature.getValue()).thenReturn(FocusMode.auto); + + camera.setFocusPoint(mockResult, point); + + verify(mockFocusPointFeature, times(1)).setValue(point); + verify(mockResult, never()).error(any(), any(), any()); + verify(mockResult, times(1)).success(null); + } + + @Test + public void setFocusPoint_shouldUpdateBuilder() { + SensorOrientationFeature mockSensorOrientationFeature = mock(SensorOrientationFeature.class); + FocusPointFeature mockFocusPointFeature = + mockCameraFeatureFactory.createFocusPointFeature( + mockCameraProperties, mockSensorOrientationFeature); + AutoFocusFeature mockAutoFocusFeature = + mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + Point point = new Point(42d, 42d); + when(mockAutoFocusFeature.getValue()).thenReturn(FocusMode.auto); + + camera.setFocusPoint(mockResult, point); + + verify(mockFocusPointFeature, times(1)).updateBuilder(any()); + } + + @Test + public void setFocusPoint_shouldCallErrorOnResultOnCameraAccessException() + throws CameraAccessException { + AutoFocusFeature mockAutoFocusFeature = + mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + Point point = new Point(42d, 42d); + when(mockAutoFocusFeature.getValue()).thenReturn(FocusMode.auto); + when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + .thenThrow(new CameraAccessException(0, "")); + + camera.setFocusPoint(mockResult, point); + + verify(mockResult, never()).success(any()); + verify(mockResult, times(1)).error("setFocusPointFailed", "Could not set focus point.", null); + } + + @Test + public void setZoomLevel_shouldUpdateZoomLevelFeature() throws CameraAccessException { + ZoomLevelFeature mockZoomLevelFeature = + mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + float zoomLevel = 1.0f; + + when(mockZoomLevelFeature.getValue()).thenReturn(zoomLevel); + when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(0f); + when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(2f); + + camera.setZoomLevel(mockResult, zoomLevel); + + verify(mockZoomLevelFeature, times(1)).setValue(zoomLevel); + verify(mockResult, never()).error(any(), any(), any()); + verify(mockResult, times(1)).success(null); + } + + @Test + public void setZoomLevel_shouldUpdateBuilder() throws CameraAccessException { + ZoomLevelFeature mockZoomLevelFeature = + mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + float zoomLevel = 1.0f; + + when(mockZoomLevelFeature.getValue()).thenReturn(zoomLevel); + when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(0f); + when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(2f); + + camera.setZoomLevel(mockResult, zoomLevel); + + verify(mockZoomLevelFeature, times(1)).updateBuilder(any()); + } + + @Test + public void setZoomLevel_shouldCallErrorOnResultOnCameraAccessException() + throws CameraAccessException { + ZoomLevelFeature mockZoomLevelFeature = + mockCameraFeatureFactory.createZoomLevelFeature(mockCameraProperties); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + float zoomLevel = 1.0f; + + when(mockZoomLevelFeature.getValue()).thenReturn(zoomLevel); + when(mockZoomLevelFeature.getMinimumZoomLevel()).thenReturn(0f); + when(mockZoomLevelFeature.getMaximumZoomLevel()).thenReturn(2f); + when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + .thenThrow(new CameraAccessException(0, "")); + + camera.setZoomLevel(mockResult, zoomLevel); + + verify(mockResult, never()).success(any()); + verify(mockResult, times(1)).error("setZoomLevelFailed", "Could not set zoom level.", null); + } + + @Test + public void pauseVideoRecording_shouldSendNullResultWhenNotRecording() { + TestUtils.setPrivateField(camera, "recordingVideo", false); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + camera.pauseVideoRecording(mockResult); + + verify(mockResult, times(1)).success(null); + verify(mockResult, never()).error(any(), any(), any()); + } + + @Test + public void pauseVideoRecording_shouldCallPauseWhenRecordingAndOnAPIN() { + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); + TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); + TestUtils.setPrivateField(camera, "recordingVideo", true); + TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); + + camera.pauseVideoRecording(mockResult); + + verify(mockMediaRecorder, times(1)).pause(); + verify(mockResult, times(1)).success(null); + verify(mockResult, never()).error(any(), any(), any()); + } + + @Test + public void pauseVideoRecording_shouldSendVideoRecordingFailedErrorWhenVersionCodeSmallerThenN() { + TestUtils.setPrivateField(camera, "recordingVideo", true); + TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 23); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + camera.pauseVideoRecording(mockResult); + + verify(mockResult, times(1)) + .error("videoRecordingFailed", "pauseVideoRecording requires Android API +24.", null); + verify(mockResult, never()).success(any()); + } + + @Test + public void + pauseVideoRecording_shouldSendVideoRecordingFailedErrorWhenMediaRecorderPauseThrowsIllegalStateException() { + MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); + TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); + TestUtils.setPrivateField(camera, "recordingVideo", true); + TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); + + IllegalStateException expectedException = new IllegalStateException("Test error message"); + + doThrow(expectedException).when(mockMediaRecorder).pause(); + + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + camera.pauseVideoRecording(mockResult); + + verify(mockResult, times(1)).error("videoRecordingFailed", "Test error message", null); + verify(mockResult, never()).success(any()); + } + + @Test + public void resumeVideoRecording_shouldSendNullResultWhenNotRecording() { + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + TestUtils.setPrivateField(camera, "recordingVideo", false); + + camera.resumeVideoRecording(mockResult); + + verify(mockResult, times(1)).success(null); + verify(mockResult, never()).error(any(), any(), any()); + } + + @Test + public void resumeVideoRecording_shouldCallPauseWhenRecordingAndOnAPIN() { + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); + TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); + TestUtils.setPrivateField(camera, "recordingVideo", true); + TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); + + camera.resumeVideoRecording(mockResult); + + verify(mockMediaRecorder, times(1)).resume(); + verify(mockResult, times(1)).success(null); + verify(mockResult, never()).error(any(), any(), any()); + } + + @Test + public void setDescriptionWhileRecording() { + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); + VideoRenderer mockVideoRenderer = mock(VideoRenderer.class); + TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); + TestUtils.setPrivateField(camera, "recordingVideo", true); + TestUtils.setPrivateField(camera, "videoRenderer", mockVideoRenderer); + + final CameraProperties newCameraProperties = mock(CameraProperties.class); + camera.setDescriptionWhileRecording(mockResult, newCameraProperties); + + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { + verify(mockResult, times(1)) + .error( + eq("setDescriptionWhileRecordingFailed"), + eq("Device does not support switching the camera while recording"), + eq(null)); + } else { + verify(mockResult, times(1)).success(null); + verify(mockResult, never()).error(any(), any(), any()); + } + } @Test public void startPreview_shouldPullStreamFromVideoRenderer() @@ -672,7 +672,9 @@ public void startPreview_shouldPullStreamFromImageReader() when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); - verify(mockImageReader, times(2)) + verify( + mockImageReader, + times(2)) // we expect one call to start the capture, one to create the capture session .getSurface(); // stream pulled from regular imageReader's surface. } @@ -733,108 +735,110 @@ public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() camera.startPreviewWithImageStream(mock(EventChannel.class)); verify(mockImageStreamReader, times(1)) .getSurface(); // stream pulled from image streaming imageReader's surface. - verify(mockPictureImageReader, times(3)) + verify( + mockPictureImageReader, + times(3)) // we expect one call to start the capture, two to create the capture session .getSurface(); // stream pulled from regular imageReader's surface. } - // @Test - // public void setDescriptionWhileRecording_shouldErrorWhenNotRecording() { - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // TestUtils.setPrivateField(camera, "recordingVideo", false); - // final CameraProperties newCameraProperties = mock(CameraProperties.class); - // camera.setDescriptionWhileRecording(mockResult, newCameraProperties); - - // verify(mockResult, times(1)) - // .error("setDescriptionWhileRecordingFailed", "Device was not recording", null); - // verify(mockResult, never()).success(any()); - // } - - // @Test - // public void - // resumeVideoRecording_shouldSendVideoRecordingFailedErrorWhenVersionCodeSmallerThanN() { - // TestUtils.setPrivateField(camera, "recordingVideo", true); - // TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 23); - - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - // camera.resumeVideoRecording(mockResult); - - // verify(mockResult, times(1)) - // .error("videoRecordingFailed", "resumeVideoRecording requires Android API +24.", null); - // verify(mockResult, never()).success(any()); - // } - - // @Test - // public void - // resumeVideoRecording_shouldSendVideoRecordingFailedErrorWhenMediaRecorderPauseThrowsIllegalStateException() { - // MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); - // TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); - // TestUtils.setPrivateField(camera, "recordingVideo", true); - // TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); - - // IllegalStateException expectedException = new IllegalStateException("Test error message"); - - // doThrow(expectedException).when(mockMediaRecorder).resume(); - - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - // camera.resumeVideoRecording(mockResult); - - // verify(mockResult, times(1)).error("videoRecordingFailed", "Test error message", null); - // verify(mockResult, never()).success(any()); - // } - - // @Test - // public void setFocusMode_shouldUpdateAutoFocusFeature() { - // AutoFocusFeature mockAutoFocusFeature = - // mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - // camera.setFocusMode(mockResult, FocusMode.auto); - - // verify(mockAutoFocusFeature, times(1)).setValue(FocusMode.auto); - // verify(mockResult, never()).error(any(), any(), any()); - // verify(mockResult, times(1)).success(null); - // } - - // @Test - // public void setFocusMode_shouldUpdateBuilder() { - // AutoFocusFeature mockAutoFocusFeature = - // mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - // camera.setFocusMode(mockResult, FocusMode.auto); - - // verify(mockAutoFocusFeature, times(1)).updateBuilder(any()); - // } - - // @Test - // public void setFocusMode_shouldUnlockAutoFocusForAutoMode() { - // camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); - // verify(mockPreviewRequestBuilder, times(1)) - // .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); - // verify(mockPreviewRequestBuilder, times(1)) - // .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_IDLE); - // } - - // @Test - // public void setFocusMode_shouldSkipUnlockAutoFocusWhenNullCaptureSession() { - // TestUtils.setPrivateField(camera, "captureSession", null); - // camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); - // verify(mockPreviewRequestBuilder, never()) - // .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); - // verify(mockPreviewRequestBuilder, never()) - // .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_IDLE); - // } - - // @Test - // public void setFocusMode_shouldSendErrorEventOnUnlockAutoFocusCameraAccessException() - // throws CameraAccessException { - // when(mockCaptureSession.capture(any(), any(), any())) - // .thenThrow(new CameraAccessException(0, "")); - // camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); - // verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); - // } + @Test + public void setDescriptionWhileRecording_shouldErrorWhenNotRecording() { + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + TestUtils.setPrivateField(camera, "recordingVideo", false); + final CameraProperties newCameraProperties = mock(CameraProperties.class); + camera.setDescriptionWhileRecording(mockResult, newCameraProperties); + + verify(mockResult, times(1)) + .error("setDescriptionWhileRecordingFailed", "Device was not recording", null); + verify(mockResult, never()).success(any()); + } + + @Test + public void + resumeVideoRecording_shouldSendVideoRecordingFailedErrorWhenVersionCodeSmallerThanN() { + TestUtils.setPrivateField(camera, "recordingVideo", true); + TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 23); + + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + camera.resumeVideoRecording(mockResult); + + verify(mockResult, times(1)) + .error("videoRecordingFailed", "resumeVideoRecording requires Android API +24.", null); + verify(mockResult, never()).success(any()); + } + + @Test + public void + resumeVideoRecording_shouldSendVideoRecordingFailedErrorWhenMediaRecorderPauseThrowsIllegalStateException() { + MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); + TestUtils.setPrivateField(camera, "mediaRecorder", mockMediaRecorder); + TestUtils.setPrivateField(camera, "recordingVideo", true); + TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", 24); + + IllegalStateException expectedException = new IllegalStateException("Test error message"); + + doThrow(expectedException).when(mockMediaRecorder).resume(); + + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + camera.resumeVideoRecording(mockResult); + + verify(mockResult, times(1)).error("videoRecordingFailed", "Test error message", null); + verify(mockResult, never()).success(any()); + } + + @Test + public void setFocusMode_shouldUpdateAutoFocusFeature() { + AutoFocusFeature mockAutoFocusFeature = + mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + camera.setFocusMode(mockResult, FocusMode.auto); + + verify(mockAutoFocusFeature, times(1)).setValue(FocusMode.auto); + verify(mockResult, never()).error(any(), any(), any()); + verify(mockResult, times(1)).success(null); + } + + @Test + public void setFocusMode_shouldUpdateBuilder() { + AutoFocusFeature mockAutoFocusFeature = + mockCameraFeatureFactory.createAutoFocusFeature(mockCameraProperties, false); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + camera.setFocusMode(mockResult, FocusMode.auto); + + verify(mockAutoFocusFeature, times(1)).updateBuilder(any()); + } + + @Test + public void setFocusMode_shouldUnlockAutoFocusForAutoMode() { + camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); + verify(mockPreviewRequestBuilder, times(1)) + .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); + verify(mockPreviewRequestBuilder, times(1)) + .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_IDLE); + } + + @Test + public void setFocusMode_shouldSkipUnlockAutoFocusWhenNullCaptureSession() { + TestUtils.setPrivateField(camera, "captureSession", null); + camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); + verify(mockPreviewRequestBuilder, never()) + .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); + verify(mockPreviewRequestBuilder, never()) + .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_IDLE); + } + + @Test + public void setFocusMode_shouldSendErrorEventOnUnlockAutoFocusCameraAccessException() + throws CameraAccessException { + when(mockCaptureSession.capture(any(), any(), any())) + .thenThrow(new CameraAccessException(0, "")); + camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.auto); + verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); + } @Test public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader() @@ -873,212 +877,212 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader .getSurface(); // stream pulled from image streaming imageReader's surface. } - // @Test - // public void setFocusMode_shouldLockAutoFocusForLockedMode() throws CameraAccessException { - // camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); - // verify(mockPreviewRequestBuilder, times(1)) - // .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); - // verify(mockCaptureSession, times(1)).capture(any(), any(), any()); - // verify(mockCaptureSession, times(1)).setRepeatingRequest(any(), any(), any()); - // } - - // @Test - // public void setFocusMode_shouldSkipLockAutoFocusWhenNullCaptureSession() { - // TestUtils.setPrivateField(camera, "captureSession", null); - // camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); - // verify(mockPreviewRequestBuilder, never()) - // .set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START); - // } - - // @Test - // public void setFocusMode_shouldSendErrorEventOnLockAutoFocusCameraAccessException() - // throws CameraAccessException { - // when(mockCaptureSession.capture(any(), any(), any())) - // .thenThrow(new CameraAccessException(0, "")); - // camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); - // verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); - // } - - // @Test - // public void setFocusMode_shouldCallErrorOnResultOnCameraAccessException() - // throws CameraAccessException { - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - // .thenThrow(new CameraAccessException(0, "")); - - // camera.setFocusMode(mockResult, FocusMode.locked); - - // verify(mockResult, never()).success(any()); - // verify(mockResult, times(1)) - // .error("setFocusModeFailed", "Error setting focus mode: null", null); - // } - - // @Test - // public void setExposureOffset_shouldUpdateExposureOffsetFeature() { - // ExposureOffsetFeature mockExposureOffsetFeature = - // mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - // when(mockExposureOffsetFeature.getValue()).thenReturn(1.0); - - // camera.setExposureOffset(mockResult, 1.0); - - // verify(mockExposureOffsetFeature, times(1)).setValue(1.0); - // verify(mockResult, never()).error(any(), any(), any()); - // verify(mockResult, times(1)).success(1.0); - // } - - // @Test - // public void setExposureOffset_shouldAndUpdateBuilder() { - // ExposureOffsetFeature mockExposureOffsetFeature = - // mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - - // camera.setExposureOffset(mockResult, 1.0); - - // verify(mockExposureOffsetFeature, times(1)).updateBuilder(any()); - // } - - // @Test - // public void setExposureOffset_shouldCallErrorOnResultOnCameraAccessException() - // throws CameraAccessException { - // MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - // .thenThrow(new CameraAccessException(0, "")); - - // camera.setExposureOffset(mockResult, 1.0); - - // verify(mockResult, never()).success(any()); - // verify(mockResult, times(1)) - // .error("setExposureOffsetFailed", "Could not set exposure offset.", null); - // } - - // @Test - // public void lockCaptureOrientation_shouldLockCaptureOrientation() { - // final Activity mockActivity = mock(Activity.class); - // SensorOrientationFeature mockSensorOrientationFeature = - // mockCameraFeatureFactory.createSensorOrientationFeature( - // mockCameraProperties, mockActivity, mockDartMessenger); - - // camera.lockCaptureOrientation(PlatformChannel.DeviceOrientation.PORTRAIT_UP); - - // verify(mockSensorOrientationFeature, times(1)) - // .lockCaptureOrientation(PlatformChannel.DeviceOrientation.PORTRAIT_UP); - // } - - // @Test - // public void unlockCaptureOrientation_shouldUnlockCaptureOrientation() { - // final Activity mockActivity = mock(Activity.class); - // SensorOrientationFeature mockSensorOrientationFeature = - // mockCameraFeatureFactory.createSensorOrientationFeature( - // mockCameraProperties, mockActivity, mockDartMessenger); - - // camera.unlockCaptureOrientation(); - - // verify(mockSensorOrientationFeature, times(1)).unlockCaptureOrientation(); - // } - - // @Test - // public void pausePreview_shouldPausePreview() throws CameraAccessException { - // camera.pausePreview(); - - // assertEquals(TestUtils.getPrivateField(camera, "pausedPreview"), true); - // verify(mockCaptureSession, times(1)).stopRepeating(); - // } - - // @Test - // public void resumePreview_shouldResumePreview() throws CameraAccessException { - // camera.resumePreview(); - - // assertEquals(TestUtils.getPrivateField(camera, "pausedPreview"), false); - // verify(mockCaptureSession, times(1)).setRepeatingRequest(any(), any(), any()); - // } - - // @Test - // public void resumePreview_shouldSendErrorEventOnCameraAccessException() - // throws CameraAccessException { - // when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) - // .thenThrow(new CameraAccessException(0)); - - // camera.resumePreview(); - - // verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); - // } - - // @Test - // public void startBackgroundThread_shouldStartNewThread() { - // camera.startBackgroundThread(); - - // verify(mockHandlerThread, times(1)).start(); - // assertEquals(mockHandler, TestUtils.getPrivateField(camera, "backgroundHandler")); - // } - - // @Test - // public void startBackgroundThread_shouldNotStartNewThreadWhenAlreadyCreated() { - // camera.startBackgroundThread(); - // camera.startBackgroundThread(); - - // verify(mockHandlerThread, times(1)).start(); - // } - - // @Test - // public void stopBackgroundThread_quitsSafely() throws InterruptedException { - // camera.startBackgroundThread(); - // camera.stopBackgroundThread(); - - // verify(mockHandlerThread).quitSafely(); - // verify(mockHandlerThread, never()).join(); - // } - - // @Test - // public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAccessException { - // ArrayList mockRequestBuilders = new ArrayList<>(); - // mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); - // CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - // // Stub out other features used by the flow. - // TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); - // TestUtils.setPrivateField(camera, "pictureImageReader", mock(ImageReader.class)); - // SensorOrientationFeature mockSensorOrientationFeature = - // mockCameraFeatureFactory.createSensorOrientationFeature(mockCameraProperties, null, null); - // DeviceOrientationManager mockDeviceOrientationManager = mock(DeviceOrientationManager.class); - // when(mockSensorOrientationFeature.getDeviceOrientationManager()) - // .thenReturn(mockDeviceOrientationManager); - - // // Simulate a post-precapture flow. - // camera.onConverged(); - // // A picture should be taken. - // verify(mockCaptureSession, times(1)).capture(any(), any(), any()); - // // The session shuold not be aborted as part of this flow, as this breaks capture on some - // // devices, and causes delays on others. - // verify(mockCaptureSession, never()).abortCaptures(); - // } - - // @Test - // public void createCaptureSession_doesNotCloseCaptureSession() throws CameraAccessException { - // Surface mockSurface = mock(Surface.class); - // SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); - // ResolutionFeature mockResolutionFeature = mock(ResolutionFeature.class); - // Size mockSize = mock(Size.class); - // ArrayList mockRequestBuilders = new ArrayList<>(); - // mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); - // CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - // TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); - - // TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = - // (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); - // CameraFeatures cameraFeatures = - // (CameraFeatures) TestUtils.getPrivateField(camera, "cameraFeatures"); - // ResolutionFeature resolutionFeature = - // (ResolutionFeature) - // TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); - - // when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); - // when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); - - // camera.createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, mockSurface); - - // verify(mockCaptureSession, never()).close(); - // } + @Test + public void setFocusMode_shouldLockAutoFocusForLockedMode() throws CameraAccessException { + camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); + verify(mockPreviewRequestBuilder, times(1)) + .set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); + verify(mockCaptureSession, times(1)).capture(any(), any(), any()); + verify(mockCaptureSession, times(1)).setRepeatingRequest(any(), any(), any()); + } + + @Test + public void setFocusMode_shouldSkipLockAutoFocusWhenNullCaptureSession() { + TestUtils.setPrivateField(camera, "captureSession", null); + camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); + verify(mockPreviewRequestBuilder, never()) + .set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START); + } + + @Test + public void setFocusMode_shouldSendErrorEventOnLockAutoFocusCameraAccessException() + throws CameraAccessException { + when(mockCaptureSession.capture(any(), any(), any())) + .thenThrow(new CameraAccessException(0, "")); + camera.setFocusMode(mock(MethodChannel.Result.class), FocusMode.locked); + verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); + } + + @Test + public void setFocusMode_shouldCallErrorOnResultOnCameraAccessException() + throws CameraAccessException { + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + .thenThrow(new CameraAccessException(0, "")); + + camera.setFocusMode(mockResult, FocusMode.locked); + + verify(mockResult, never()).success(any()); + verify(mockResult, times(1)) + .error("setFocusModeFailed", "Error setting focus mode: null", null); + } + + @Test + public void setExposureOffset_shouldUpdateExposureOffsetFeature() { + ExposureOffsetFeature mockExposureOffsetFeature = + mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + when(mockExposureOffsetFeature.getValue()).thenReturn(1.0); + + camera.setExposureOffset(mockResult, 1.0); + + verify(mockExposureOffsetFeature, times(1)).setValue(1.0); + verify(mockResult, never()).error(any(), any(), any()); + verify(mockResult, times(1)).success(1.0); + } + + @Test + public void setExposureOffset_shouldAndUpdateBuilder() { + ExposureOffsetFeature mockExposureOffsetFeature = + mockCameraFeatureFactory.createExposureOffsetFeature(mockCameraProperties); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + + camera.setExposureOffset(mockResult, 1.0); + + verify(mockExposureOffsetFeature, times(1)).updateBuilder(any()); + } + + @Test + public void setExposureOffset_shouldCallErrorOnResultOnCameraAccessException() + throws CameraAccessException { + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + .thenThrow(new CameraAccessException(0, "")); + + camera.setExposureOffset(mockResult, 1.0); + + verify(mockResult, never()).success(any()); + verify(mockResult, times(1)) + .error("setExposureOffsetFailed", "Could not set exposure offset.", null); + } + + @Test + public void lockCaptureOrientation_shouldLockCaptureOrientation() { + final Activity mockActivity = mock(Activity.class); + SensorOrientationFeature mockSensorOrientationFeature = + mockCameraFeatureFactory.createSensorOrientationFeature( + mockCameraProperties, mockActivity, mockDartMessenger); + + camera.lockCaptureOrientation(PlatformChannel.DeviceOrientation.PORTRAIT_UP); + + verify(mockSensorOrientationFeature, times(1)) + .lockCaptureOrientation(PlatformChannel.DeviceOrientation.PORTRAIT_UP); + } + + @Test + public void unlockCaptureOrientation_shouldUnlockCaptureOrientation() { + final Activity mockActivity = mock(Activity.class); + SensorOrientationFeature mockSensorOrientationFeature = + mockCameraFeatureFactory.createSensorOrientationFeature( + mockCameraProperties, mockActivity, mockDartMessenger); + + camera.unlockCaptureOrientation(); + + verify(mockSensorOrientationFeature, times(1)).unlockCaptureOrientation(); + } + + @Test + public void pausePreview_shouldPausePreview() throws CameraAccessException { + camera.pausePreview(); + + assertEquals(TestUtils.getPrivateField(camera, "pausedPreview"), true); + verify(mockCaptureSession, times(1)).stopRepeating(); + } + + @Test + public void resumePreview_shouldResumePreview() throws CameraAccessException { + camera.resumePreview(); + + assertEquals(TestUtils.getPrivateField(camera, "pausedPreview"), false); + verify(mockCaptureSession, times(1)).setRepeatingRequest(any(), any(), any()); + } + + @Test + public void resumePreview_shouldSendErrorEventOnCameraAccessException() + throws CameraAccessException { + when(mockCaptureSession.setRepeatingRequest(any(), any(), any())) + .thenThrow(new CameraAccessException(0)); + + camera.resumePreview(); + + verify(mockDartMessenger, times(1)).sendCameraErrorEvent(any()); + } + + @Test + public void startBackgroundThread_shouldStartNewThread() { + camera.startBackgroundThread(); + + verify(mockHandlerThread, times(1)).start(); + assertEquals(mockHandler, TestUtils.getPrivateField(camera, "backgroundHandler")); + } + + @Test + public void startBackgroundThread_shouldNotStartNewThreadWhenAlreadyCreated() { + camera.startBackgroundThread(); + camera.startBackgroundThread(); + + verify(mockHandlerThread, times(1)).start(); + } + + @Test + public void stopBackgroundThread_quitsSafely() throws InterruptedException { + camera.startBackgroundThread(); + camera.stopBackgroundThread(); + + verify(mockHandlerThread).quitSafely(); + verify(mockHandlerThread, never()).join(); + } + + @Test + public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAccessException { + ArrayList mockRequestBuilders = new ArrayList<>(); + mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); + // Stub out other features used by the flow. + TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + TestUtils.setPrivateField(camera, "pictureImageReader", mock(ImageReader.class)); + SensorOrientationFeature mockSensorOrientationFeature = + mockCameraFeatureFactory.createSensorOrientationFeature(mockCameraProperties, null, null); + DeviceOrientationManager mockDeviceOrientationManager = mock(DeviceOrientationManager.class); + when(mockSensorOrientationFeature.getDeviceOrientationManager()) + .thenReturn(mockDeviceOrientationManager); + + // Simulate a post-precapture flow. + camera.onConverged(); + // A picture should be taken. + verify(mockCaptureSession, times(1)).capture(any(), any(), any()); + // The session shuold not be aborted as part of this flow, as this breaks capture on some + // devices, and causes delays on others. + verify(mockCaptureSession, never()).abortCaptures(); + } + + @Test + public void createCaptureSession_doesNotCloseCaptureSession() throws CameraAccessException { + Surface mockSurface = mock(Surface.class); + SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); + ResolutionFeature mockResolutionFeature = mock(ResolutionFeature.class); + Size mockSize = mock(Size.class); + ArrayList mockRequestBuilders = new ArrayList<>(); + mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); + TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = + (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); + CameraFeatures cameraFeatures = + (CameraFeatures) TestUtils.getPrivateField(camera, "cameraFeatures"); + ResolutionFeature resolutionFeature = + (ResolutionFeature) + TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); + when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); + + camera.createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, mockSurface); + + verify(mockCaptureSession, never()).close(); + } @Test public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest() @@ -1119,24 +1123,24 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest verify(mockPreviewRequestBuilder).addTarget(mockSecondarySurface); } - // @Test - // public void close_doesCloseCaptureSessionWhenCameraDeviceNull() { - // camera.close(); + @Test + public void close_doesCloseCaptureSessionWhenCameraDeviceNull() { + camera.close(); - // verify(mockCaptureSession).close(); - // } + verify(mockCaptureSession).close(); + } - // @Test - // public void close_doesNotCloseCaptureSessionWhenCameraDeviceNonNull() { - // ArrayList mockRequestBuilders = new ArrayList<>(); - // mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); - // CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); - // TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + @Test + public void close_doesNotCloseCaptureSessionWhenCameraDeviceNonNull() { + ArrayList mockRequestBuilders = new ArrayList<>(); + mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); + TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); - // camera.close(); + camera.close(); - // verify(mockCaptureSession, never()).close(); - // } + verify(mockCaptureSession, never()).close(); + } private static class TestCameraFeatureFactory implements CameraFeatureFactory { private final AutoFocusFeature mockAutoFocusFeature; From a0af9ccff125016b8d3258a0c50d5fe1d9808551 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 10:50:14 -0700 Subject: [PATCH 17/28] Add back imports --- .../java/io/flutter/plugins/camera/CameraTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 739608716aad..24a185cb2281 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -4,11 +4,17 @@ package io.flutter.plugins.camera; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -31,20 +37,27 @@ import android.view.Surface; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.lifecycle.LifecycleObserver; +import io.flutter.embedding.engine.systemchannels.PlatformChannel; import io.flutter.plugin.common.EventChannel; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugins.camera.features.CameraFeatureFactory; import io.flutter.plugins.camera.features.CameraFeatures; +import io.flutter.plugins.camera.features.Point; import io.flutter.plugins.camera.features.autofocus.AutoFocusFeature; +import io.flutter.plugins.camera.features.autofocus.FocusMode; import io.flutter.plugins.camera.features.exposurelock.ExposureLockFeature; +import io.flutter.plugins.camera.features.exposurelock.ExposureMode; import io.flutter.plugins.camera.features.exposureoffset.ExposureOffsetFeature; import io.flutter.plugins.camera.features.exposurepoint.ExposurePointFeature; import io.flutter.plugins.camera.features.flash.FlashFeature; +import io.flutter.plugins.camera.features.flash.FlashMode; import io.flutter.plugins.camera.features.focuspoint.FocusPointFeature; import io.flutter.plugins.camera.features.fpsrange.FpsRangeFeature; import io.flutter.plugins.camera.features.noisereduction.NoiseReductionFeature; import io.flutter.plugins.camera.features.resolution.ResolutionFeature; import io.flutter.plugins.camera.features.resolution.ResolutionPreset; +import io.flutter.plugins.camera.features.sensororientation.DeviceOrientationManager; import io.flutter.plugins.camera.features.sensororientation.SensorOrientationFeature; import io.flutter.plugins.camera.features.zoomlevel.ZoomLevelFeature; import io.flutter.plugins.camera.media.ImageStreamReader; From ce3c25c9f682b87bbc46c7b525733baee352c120 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 11:12:53 -0700 Subject: [PATCH 18/28] Add one last comment --- .../src/test/java/io/flutter/plugins/camera/CameraTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 24a185cb2281..24fbf290622f 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -886,7 +886,7 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader cameraSpy.startVideoRecording(mockResult, null); verify(mockMediaRecorder, times(1)) .getSurface(); // stream pulled from media recorder's surface. - verify(mockPictureImageReader, times(3)) + verify(mockPictureImageReader, times(3)) // we expect one call to start the capture, two to create the capture session .getSurface(); // stream pulled from image streaming imageReader's surface. } From ede8e88d36d367a363f3800f15e67bbe8ebe4c75 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 11:20:43 -0700 Subject: [PATCH 19/28] format --- .../src/test/java/io/flutter/plugins/camera/CameraTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 24fbf290622f..12c496621713 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -886,7 +886,9 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader cameraSpy.startVideoRecording(mockResult, null); verify(mockMediaRecorder, times(1)) .getSurface(); // stream pulled from media recorder's surface. - verify(mockPictureImageReader, times(3)) // we expect one call to start the capture, two to create the capture session + verify( + mockPictureImageReader, + times(3)) // we expect one call to start the capture, two to create the capture session .getSurface(); // stream pulled from image streaming imageReader's surface. } From bcfa57ca95e49c4b89c61525027e6b6705ea90f2 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 12:34:00 -0700 Subject: [PATCH 20/28] Refactor and check if surface mock needed --- .../java/io/flutter/plugins/camera/Camera.java | 3 ++- .../java/io/flutter/plugins/camera/CameraTest.java | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java index e96de93918b6..808051583f61 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -418,8 +418,9 @@ private void createCaptureSession( // If it is not preview mode, add all surfaces as targets // except the surface used for still capture as this should // not be part of a repeating request. + Surface pictureImageReaderSurface = pictureImageReader.getSurface(); for (Surface surface : remainingSurfaces) { - if (surface == pictureImageReader.getSurface()) { + if (surface == pictureImageReaderSurface) { continue; } previewRequestBuilder.addTarget(surface); diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 12c496621713..b861709279ec 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -682,7 +682,7 @@ public void startPreview_shouldPullStreamFromImageReader() when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); - when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); + // when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); verify( @@ -715,7 +715,7 @@ public void startPreview_shouldFlipRotation() throws InterruptedException, Camer when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(mockCameraProperties.getLensFacing()).thenReturn(CameraMetadata.LENS_FACING_FRONT); - when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); + // when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); verify(mockVideoRenderer, times(1)).setRotation(180); @@ -750,7 +750,7 @@ public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() .getSurface(); // stream pulled from image streaming imageReader's surface. verify( mockPictureImageReader, - times(3)) // we expect one call to start the capture, two to create the capture session + times(2)) // we expect one call to start the capture, one to create the capture session .getSurface(); // stream pulled from regular imageReader's surface. } @@ -879,8 +879,8 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); - when(mockMediaRecorder.getSurface()).thenReturn(mock(Surface.class)); - when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); + // when(mockMediaRecorder.getSurface()).thenReturn(mock(Surface.class)); + // when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); doNothing().when(cameraSpy).prepareRecording(mockResult); cameraSpy.startVideoRecording(mockResult, null); @@ -888,7 +888,7 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader .getSurface(); // stream pulled from media recorder's surface. verify( mockPictureImageReader, - times(3)) // we expect one call to start the capture, two to create the capture session + times(2)) // we expect one call to start the capture, one to create the capture session .getSurface(); // stream pulled from image streaming imageReader's surface. } @@ -1126,7 +1126,7 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(fakeCamera.createCaptureRequest(anyInt())).thenReturn(mockPreviewRequestBuilder); - when(mockPictureImageReader.getSurface()).thenReturn(mockSurface); + // when(mockPictureImageReader.getSurface()).thenReturn(mockSurface); // Test with preview template. camera.createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, mockSurface, mockSecondarySurface); From 6c1ba5e6ff33f429a8baaefc1f93787d6c4e7cd5 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 12:49:23 -0700 Subject: [PATCH 21/28] fix tests --- .../test/java/io/flutter/plugins/camera/CameraTest.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index b861709279ec..5fda04626ee7 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -682,12 +682,11 @@ public void startPreview_shouldPullStreamFromImageReader() when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); - // when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); verify( mockImageReader, - times(2)) // we expect one call to start the capture, one to create the capture session + times(3)) // we expect two calls to start regular preview, one to create the capture session .getSurface(); // stream pulled from regular imageReader's surface. } @@ -715,7 +714,6 @@ public void startPreview_shouldFlipRotation() throws InterruptedException, Camer when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(mockCameraProperties.getLensFacing()).thenReturn(CameraMetadata.LENS_FACING_FRONT); - // when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); verify(mockVideoRenderer, times(1)).setRotation(180); @@ -879,8 +877,6 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); - // when(mockMediaRecorder.getSurface()).thenReturn(mock(Surface.class)); - // when(mockPictureImageReader.getSurface()).thenReturn(mock(Surface.class)); doNothing().when(cameraSpy).prepareRecording(mockResult); cameraSpy.startVideoRecording(mockResult, null); @@ -1126,7 +1122,7 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(fakeCamera.createCaptureRequest(anyInt())).thenReturn(mockPreviewRequestBuilder); - // when(mockPictureImageReader.getSurface()).thenReturn(mockSurface); + when(mockPictureImageReader.getSurface()).thenReturn(mockSurface); // Test with preview template. camera.createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, mockSurface, mockSecondarySurface); From abf390fa7218aa749afed8d52745356ec734e925 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 12:54:37 -0700 Subject: [PATCH 22/28] Formatting --- .../src/test/java/io/flutter/plugins/camera/CameraTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 5fda04626ee7..9e62ee10701a 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -686,7 +686,8 @@ public void startPreview_shouldPullStreamFromImageReader() camera.startPreview(); verify( mockImageReader, - times(3)) // we expect two calls to start regular preview, one to create the capture session + times( + 3)) // we expect two calls to start regular preview, one to create the capture session .getSurface(); // stream pulled from regular imageReader's surface. } From 00ce87358f6cd348b20a18e23dfe3a815ff60d97 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 13:17:12 -0700 Subject: [PATCH 23/28] Add mock for test --- .../src/test/java/io/flutter/plugins/camera/CameraTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 9e62ee10701a..9c6d20aae845 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -682,6 +682,7 @@ public void startPreview_shouldPullStreamFromImageReader() when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); + when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); verify( From 10331d64cefb4f6f73d02820ed863653a27972d0 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 13:34:21 -0700 Subject: [PATCH 24/28] Correct to 2 --- .../src/test/java/io/flutter/plugins/camera/CameraTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 9c6d20aae845..0f87054c3fba 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -682,13 +682,12 @@ public void startPreview_shouldPullStreamFromImageReader() when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); - when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); verify( mockImageReader, times( - 3)) // we expect two calls to start regular preview, one to create the capture session + 2)) // we expect two calls to start regular preview .getSurface(); // stream pulled from regular imageReader's surface. } From d9347f9fa9ff128607690ff6a264ddbc1a28b2f2 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 13:39:42 -0700 Subject: [PATCH 25/28] Formatting --- .../src/test/java/io/flutter/plugins/camera/CameraTest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 0f87054c3fba..c0fd5badfa68 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -684,10 +684,7 @@ public void startPreview_shouldPullStreamFromImageReader() when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); camera.startPreview(); - verify( - mockImageReader, - times( - 2)) // we expect two calls to start regular preview + verify(mockImageReader, times(2)) // we expect two calls to start regular preview .getSurface(); // stream pulled from regular imageReader's surface. } From 020a5e244ef4e84f90901307dd7ff88de1fb7c45 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 13:51:28 -0700 Subject: [PATCH 26/28] I'm not sure why I'm getting so confused --- .../src/test/java/io/flutter/plugins/camera/CameraTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index c0fd5badfa68..1014b030cb3c 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -682,9 +682,13 @@ public void startPreview_shouldPullStreamFromImageReader() when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); + when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); - verify(mockImageReader, times(2)) // we expect two calls to start regular preview + verify( + mockImageReader, + times( + 2)) // we expect two calls to start regular preview .getSurface(); // stream pulled from regular imageReader's surface. } From ea9c3735962c9f4b563f95564a2e3bd905fa7ca5 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 13:52:07 -0700 Subject: [PATCH 27/28] format --- .../src/test/java/io/flutter/plugins/camera/CameraTest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 1014b030cb3c..9337e2a0cc6a 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -685,10 +685,7 @@ public void startPreview_shouldPullStreamFromImageReader() when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); - verify( - mockImageReader, - times( - 2)) // we expect two calls to start regular preview + verify(mockImageReader, times(2)) // we expect two calls to start regular preview .getSurface(); // stream pulled from regular imageReader's surface. } From f784750636fa647edcc596c11078a471bf47f610 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 28 Jun 2023 14:25:09 -0700 Subject: [PATCH 28/28] Add periods --- .../src/test/java/io/flutter/plugins/camera/CameraTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 9337e2a0cc6a..c7b5b768783f 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -685,7 +685,7 @@ public void startPreview_shouldPullStreamFromImageReader() when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); camera.startPreview(); - verify(mockImageReader, times(2)) // we expect two calls to start regular preview + verify(mockImageReader, times(2)) // we expect two calls to start regular preview. .getSurface(); // stream pulled from regular imageReader's surface. } @@ -747,7 +747,7 @@ public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() .getSurface(); // stream pulled from image streaming imageReader's surface. verify( mockPictureImageReader, - times(2)) // we expect one call to start the capture, one to create the capture session + times(2)) // we expect one call to start the capture, one to create the capture session. .getSurface(); // stream pulled from regular imageReader's surface. } @@ -883,7 +883,7 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader .getSurface(); // stream pulled from media recorder's surface. verify( mockPictureImageReader, - times(2)) // we expect one call to start the capture, one to create the capture session + times(2)) // we expect one call to start the capture, one to create the capture session. .getSurface(); // stream pulled from image streaming imageReader's surface. }