diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index d2eeaea58468..41d2cb9af913 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.29 + +* Modifies lens direction logic to request the value from CameraX directly versus manual detection. + ## 0.6.28 * Adds more descriptive error to camera error stream when image capture fails. diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoProxyApi.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoProxyApi.java index 0e3e51b7756d..509cdc7ba357 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoProxyApi.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoProxyApi.java @@ -5,7 +5,10 @@ package io.flutter.plugins.camerax; import androidx.annotation.NonNull; +import androidx.annotation.OptIn; import androidx.camera.core.CameraInfo; +import androidx.camera.core.CameraSelector; +import androidx.camera.core.ExperimentalLensFacing; import androidx.camera.core.ExposureState; /** @@ -23,6 +26,22 @@ public long sensorRotationDegrees(CameraInfo pigeonInstance) { return pigeonInstance.getSensorRotationDegrees(); } + @Override + @OptIn(markerClass = ExperimentalLensFacing.class) + public LensFacing lensFacing(CameraInfo pigeonInstance) { + int lensFacing = pigeonInstance.getLensFacing(); + switch (lensFacing) { + case CameraSelector.LENS_FACING_FRONT: + return LensFacing.FRONT; + case CameraSelector.LENS_FACING_BACK: + return LensFacing.BACK; + case CameraSelector.LENS_FACING_EXTERNAL: + return LensFacing.EXTERNAL; + default: + return LensFacing.UNKNOWN; + } + } + @NonNull @Override public ExposureState exposureState(CameraInfo pigeonInstance) { diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXLibrary.g.kt b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXLibrary.g.kt index 82c0e0d749de..6bda2789af65 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXLibrary.g.kt +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXLibrary.g.kt @@ -2181,6 +2181,9 @@ abstract class PigeonApiCameraInfo( */ abstract fun sensorRotationDegrees(pigeon_instance: androidx.camera.core.CameraInfo): Long + /** Returns the lens facing of this camera. */ + abstract fun lensFacing(pigeon_instance: androidx.camera.core.CameraInfo): LensFacing + /** Returns a ExposureState. */ abstract fun exposureState( pigeon_instance: androidx.camera.core.CameraInfo @@ -2263,23 +2266,26 @@ abstract class PigeonApiCameraInfo( val pigeon_identifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance(pigeon_instanceArg) val sensorRotationDegreesArg = sensorRotationDegrees(pigeon_instanceArg) + val lensFacingArg = lensFacing(pigeon_instanceArg) val exposureStateArg = exposureState(pigeon_instanceArg) val binaryMessenger = pigeonRegistrar.binaryMessenger val codec = pigeonRegistrar.codec val channelName = "dev.flutter.pigeon.camera_android_camerax.CameraInfo.pigeon_newInstance" val channel = BasicMessageChannel(binaryMessenger, channelName, codec) - channel.send(listOf(pigeon_identifierArg, sensorRotationDegreesArg, exposureStateArg)) { - if (it is List<*>) { - if (it.size > 1) { - callback( - Result.failure(CameraXError(it[0] as String, it[1] as String, it[2] as String?))) - } else { - callback(Result.success(Unit)) + channel.send( + listOf(pigeon_identifierArg, sensorRotationDegreesArg, lensFacingArg, exposureStateArg)) { + if (it is List<*>) { + if (it.size > 1) { + callback( + Result.failure( + CameraXError(it[0] as String, it[1] as String, it[2] as String?))) + } else { + callback(Result.success(Unit)) + } + } else { + callback(Result.failure(CameraXLibraryPigeonUtils.createConnectionError(channelName))) + } } - } else { - callback(Result.failure(CameraXLibraryPigeonUtils.createConnectionError(channelName))) - } - } } } } 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 169d33b70a54..cb626ce45994 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 @@ -9,15 +9,18 @@ import static org.mockito.Mockito.when; import androidx.camera.core.CameraInfo; +import androidx.camera.core.CameraSelector; import androidx.camera.core.CameraState; import androidx.camera.core.ExposureState; import androidx.camera.core.ZoomState; import androidx.lifecycle.LiveData; +import java.util.Arrays; +import java.util.List; import org.junit.Test; public class CameraInfoTest { @Test - public void getSensorRotationDegrees_makesCallToRetrieveSensorRotationDegrees() { + public void sensorRotationDegrees_makesCallToRetrieveSensorRotationDegrees() { final PigeonApiCameraInfo api = new TestProxyApiRegistrar().getPigeonApiCameraInfo(); final CameraInfo instance = mock(CameraInfo.class); @@ -27,6 +30,41 @@ public void getSensorRotationDegrees_makesCallToRetrieveSensorRotationDegrees() assertEquals(value, api.sensorRotationDegrees(instance)); } + @Test + public void lensFacing_makesCallToRetrieveLensFacing() { + final PigeonApiCameraInfo api = new TestProxyApiRegistrar().getPigeonApiCameraInfo(); + + final CameraInfo instance = mock(CameraInfo.class); + List testedLensFacingValues = + Arrays.asList( + CameraSelector.LENS_FACING_BACK, + CameraSelector.LENS_FACING_FRONT, + CameraSelector.LENS_FACING_EXTERNAL, + CameraSelector.LENS_FACING_UNKNOWN); + + for (int testedLensFacingValue : testedLensFacingValues) { + when(instance.getLensFacing()).thenReturn(testedLensFacingValue); + + LensFacing expected; + switch (testedLensFacingValue) { + case CameraSelector.LENS_FACING_BACK: + expected = LensFacing.BACK; + break; + case CameraSelector.LENS_FACING_FRONT: + expected = LensFacing.FRONT; + break; + case CameraSelector.LENS_FACING_EXTERNAL: + expected = LensFacing.EXTERNAL; + break; + default: + expected = LensFacing.UNKNOWN; + break; + } + + assertEquals(expected, api.lensFacing(instance)); + } + } + @SuppressWarnings("unchecked") @Test public void getCameraState_makesCallToRetrieveLiveCameraState() { 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 d09252b62c80..864172e6a190 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 @@ -307,19 +307,17 @@ class AndroidCameraCameraX extends CameraPlatform { String? cameraName; for (final cameraInfo in cameraInfos) { - // Determine the lens direction by filtering the CameraInfo - // TODO(gmackall): replace this with call to CameraInfo.getLensFacing when changes containing that method are available - if ((await CameraSelector( - requireLensFacing: LensFacing.back, - ).filter([cameraInfo])).isNotEmpty) { - cameraLensDirection = CameraLensDirection.back; - } else if ((await CameraSelector( - requireLensFacing: LensFacing.front, - ).filter([cameraInfo])).isNotEmpty) { - cameraLensDirection = CameraLensDirection.front; - } else { - //Skip this CameraInfo as its lens direction is unknown - continue; + final LensFacing lensFacing = cameraInfo.lensFacing; + switch (lensFacing) { + case LensFacing.front: + cameraLensDirection = CameraLensDirection.front; + case LensFacing.back: + cameraLensDirection = CameraLensDirection.back; + case LensFacing.external: + cameraLensDirection = CameraLensDirection.external; + case LensFacing.unknown: + // Skip this CameraInfo as its lens direction is unknown + continue; } cameraSensorOrientation = cameraInfo.sensorRotationDegrees; diff --git a/packages/camera/camera_android_camerax/lib/src/camerax_library.dart b/packages/camera/camera_android_camerax/lib/src/camerax_library.dart index 9d02880c3399..1731bca4680b 100644 --- a/packages/camera/camera_android_camerax/lib/src/camerax_library.dart +++ b/packages/camera/camera_android_camerax/lib/src/camerax_library.dart @@ -56,9 +56,14 @@ void setUpGenerics({BinaryMessenger? pigeonBinaryMessenger}) { camerax.CameraInfo.pigeon_setUpMessageHandlers( pigeon_newInstance: - (int sensorRotationDegrees, camerax.ExposureState exposureState) { + ( + int sensorRotationDegrees, + camerax.LensFacing lensFacing, + camerax.ExposureState exposureState, + ) { return CameraInfo.detached( sensorRotationDegrees: sensorRotationDegrees, + lensFacing: lensFacing, exposureState: exposureState, pigeon_binaryMessenger: pigeonBinaryMessenger, ); @@ -101,6 +106,7 @@ class CameraInfo extends camerax.CameraInfo { /// create copies for an [PigeonInstanceManager]. CameraInfo.detached({ required super.sensorRotationDegrees, + required super.lensFacing, required super.exposureState, // ignore: non_constant_identifier_names super.pigeon_binaryMessenger, @@ -121,6 +127,7 @@ class CameraInfo extends camerax.CameraInfo { CameraInfo pigeon_copy() { return CameraInfo.detached( sensorRotationDegrees: sensorRotationDegrees, + lensFacing: lensFacing, exposureState: exposureState, pigeon_binaryMessenger: pigeon_binaryMessenger, ); 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 a2fccdb06b93..67ee031866e5 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 @@ -2107,6 +2107,7 @@ class CameraInfo extends PigeonInternalProxyApiBaseClass { super.pigeon_binaryMessenger, super.pigeon_instanceManager, required this.sensorRotationDegrees, + required this.lensFacing, required this.exposureState, }); @@ -2117,6 +2118,9 @@ class CameraInfo extends PigeonInternalProxyApiBaseClass { /// (default) orientation. final int sensorRotationDegrees; + /// Returns the lens facing of this camera. + final LensFacing lensFacing; + /// Returns a ExposureState. final ExposureState exposureState; @@ -2124,7 +2128,11 @@ class CameraInfo extends PigeonInternalProxyApiBaseClass { bool pigeon_clearHandlers = false, BinaryMessenger? pigeon_binaryMessenger, PigeonInstanceManager? pigeon_instanceManager, - CameraInfo Function(int sensorRotationDegrees, ExposureState exposureState)? + CameraInfo Function( + int sensorRotationDegrees, + LensFacing lensFacing, + ExposureState exposureState, + )? pigeon_newInstance, }) { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = @@ -2157,7 +2165,12 @@ class CameraInfo extends PigeonInternalProxyApiBaseClass { arg_sensorRotationDegrees != null, 'Argument for dev.flutter.pigeon.camera_android_camerax.CameraInfo.pigeon_newInstance was null, expected non-null int.', ); - final ExposureState? arg_exposureState = (args[2] as ExposureState?); + final LensFacing? arg_lensFacing = (args[2] as LensFacing?); + assert( + arg_lensFacing != null, + 'Argument for dev.flutter.pigeon.camera_android_camerax.CameraInfo.pigeon_newInstance was null, expected non-null LensFacing.', + ); + final ExposureState? arg_exposureState = (args[3] as ExposureState?); assert( arg_exposureState != null, 'Argument for dev.flutter.pigeon.camera_android_camerax.CameraInfo.pigeon_newInstance was null, expected non-null ExposureState.', @@ -2167,12 +2180,14 @@ class CameraInfo extends PigeonInternalProxyApiBaseClass { .addHostCreatedInstance( pigeon_newInstance?.call( arg_sensorRotationDegrees!, + arg_lensFacing!, arg_exposureState!, ) ?? CameraInfo.pigeon_detached( pigeon_binaryMessenger: pigeon_binaryMessenger, pigeon_instanceManager: pigeon_instanceManager, sensorRotationDegrees: arg_sensorRotationDegrees!, + lensFacing: arg_lensFacing!, exposureState: arg_exposureState!, ), arg_pigeon_instanceIdentifier!, @@ -2264,6 +2279,7 @@ class CameraInfo extends PigeonInternalProxyApiBaseClass { pigeon_binaryMessenger: pigeon_binaryMessenger, pigeon_instanceManager: pigeon_instanceManager, sensorRotationDegrees: sensorRotationDegrees, + lensFacing: lensFacing, exposureState: exposureState, ); } diff --git a/packages/camera/camera_android_camerax/pigeons/camerax_library.dart b/packages/camera/camera_android_camerax/pigeons/camerax_library.dart index f33db856d4ac..68fa4f0fdba8 100644 --- a/packages/camera/camera_android_camerax/pigeons/camerax_library.dart +++ b/packages/camera/camera_android_camerax/pigeons/camerax_library.dart @@ -251,6 +251,9 @@ abstract class CameraInfo { /// (default) orientation. late int sensorRotationDegrees; + /// Returns the lens direction of this camera. + late LensFacing lensFacing; + /// Returns a ExposureState. late ExposureState exposureState; diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 7471b21c275b..053aeef15f80 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android_camerax description: Android implementation of the camera plugin using the CameraX library. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android_camerax issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.6.28 +version: 0.6.29 environment: sdk: ^3.9.0 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 0b4033025d6e..fda643be2faf 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 @@ -516,27 +516,12 @@ void main() { // Create mocks to use final mockProcessCameraProvider = MockProcessCameraProvider(); - final mockFrontCameraSelector = MockCameraSelector(); - final mockBackCameraSelector = MockCameraSelector(); final mockFrontCameraInfo = MockCameraInfo(); final mockBackCameraInfo = MockCameraInfo(); // Tell plugin to create mock CameraSelectors for testing. PigeonOverrides.processCameraProvider_getInstance = () async => mockProcessCameraProvider; - PigeonOverrides.cameraSelector_new = - ({LensFacing? requireLensFacing, dynamic cameraInfoForFilter}) { - switch (requireLensFacing) { - case LensFacing.front: - return mockFrontCameraSelector; - case LensFacing.back: - case LensFacing.external: - case LensFacing.unknown: - case null: - } - - return mockBackCameraSelector; - }; PigeonOverrides.camera2CameraInfo_from = ({required dynamic cameraInfo}) { final camera2cameraInfo = MockCamera2CameraInfo(); var cameraId = ''; @@ -559,20 +544,11 @@ void main() { when(mockProcessCameraProvider.getAvailableCameraInfos()).thenAnswer( (_) async => [mockBackCameraInfo, mockFrontCameraInfo], ); - when( - mockBackCameraSelector.filter([mockFrontCameraInfo]), - ).thenAnswer((_) async => []); - when( - mockBackCameraSelector.filter([mockBackCameraInfo]), - ).thenAnswer((_) async => [mockBackCameraInfo]); - when( - mockFrontCameraSelector.filter([mockBackCameraInfo]), - ).thenAnswer((_) async => []); - when( - mockFrontCameraSelector.filter([mockFrontCameraInfo]), - ).thenAnswer((_) async => [mockFrontCameraInfo]); when(mockBackCameraInfo.sensorRotationDegrees).thenReturn(0); + when(mockBackCameraInfo.lensFacing).thenReturn(LensFacing.back); + when(mockFrontCameraInfo.sensorRotationDegrees).thenReturn(90); + when(mockFrontCameraInfo.lensFacing).thenReturn(LensFacing.front); final List cameraDescriptions = await camera .availableCameras(); @@ -1738,6 +1714,10 @@ void main() { final mockBackCameraInfoOne = MockCameraInfo(); final mockBackCameraInfoTwo = MockCameraInfo(); + when(mockFrontCameraInfo.lensFacing).thenReturn(LensFacing.front); + when(mockBackCameraInfoOne.lensFacing).thenReturn(LensFacing.back); + when(mockBackCameraInfoTwo.lensFacing).thenReturn(LensFacing.back); + // Mock/Detached objects for (typically attached) objects created by // createCamera. final mockPreview = MockPreview(); @@ -1931,24 +1911,6 @@ void main() { mockFrontCameraInfo, ]; }); - when( - mockBackCameraSelector.filter([mockBackCameraInfoOne]), - ).thenAnswer((_) async => [mockBackCameraInfoOne]); - when( - mockBackCameraSelector.filter([mockBackCameraInfoTwo]), - ).thenAnswer((_) async => [mockBackCameraInfoTwo]); - when( - mockBackCameraSelector.filter([mockFrontCameraInfo]), - ).thenAnswer((_) async => []); - when( - mockFrontCameraSelector.filter([mockBackCameraInfoOne]), - ).thenAnswer((_) async => []); - when( - mockFrontCameraSelector.filter([mockBackCameraInfoTwo]), - ).thenAnswer((_) async => []); - when( - mockFrontCameraSelector.filter([mockFrontCameraInfo]), - ).thenAnswer((_) async => [mockFrontCameraInfo]); final List cameraDescriptions = await camera .availableCameras(); @@ -3500,18 +3462,6 @@ void main() { when( mockProcessCameraProvider.bindToLifecycle(any, any), ).thenAnswer((_) async => mockCamera); - when( - mockBackCameraSelector.filter([mockBackCameraInfo]), - ).thenAnswer((_) async => [mockBackCameraInfo]); - when( - mockBackCameraSelector.filter([mockFrontCameraInfo]), - ).thenAnswer((_) async => [mockFrontCameraInfo]); - when( - mockFrontCameraSelector.filter([mockBackCameraInfo]), - ).thenAnswer((_) async => [mockBackCameraInfo]); - when( - mockFrontCameraSelector.filter([mockFrontCameraInfo]), - ).thenAnswer((_) async => [mockFrontCameraInfo]); camera.processCameraProvider = mockProcessCameraProvider; camera.liveCameraState = mockLiveCameraState; @@ -3775,18 +3725,6 @@ void main() { when( mockProcessCameraProvider.bindToLifecycle(any, any), ).thenAnswer((_) async => mockCamera); - when( - mockBackCameraSelector.filter([mockBackCameraInfo]), - ).thenAnswer((_) async => [mockBackCameraInfo]); - when( - mockBackCameraSelector.filter([mockFrontCameraInfo]), - ).thenAnswer((_) async => [mockFrontCameraInfo]); - when( - mockFrontCameraSelector.filter([mockBackCameraInfo]), - ).thenAnswer((_) async => [mockBackCameraInfo]); - when( - mockFrontCameraSelector.filter([mockFrontCameraInfo]), - ).thenAnswer((_) async => [mockFrontCameraInfo]); camera.processCameraProvider = mockProcessCameraProvider; camera.enableRecordingAudio = false; 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 1399bcbba6f5..aa997efe8d05 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 @@ -447,6 +447,15 @@ class MockCameraInfo extends _i1.Mock implements _i3.CameraInfo { ) as int); + @override + _i2.LensFacing get lensFacing => + (super.noSuchMethod( + Invocation.getter(#lensFacing), + returnValue: _i2.LensFacing.front, + returnValueForMissingStub: _i2.LensFacing.front, + ) + as _i2.LensFacing); + @override _i2.ExposureState get exposureState => (super.noSuchMethod( diff --git a/packages/camera/camera_android_camerax/test/preview_rotation_test.dart b/packages/camera/camera_android_camerax/test/preview_rotation_test.dart index e81ae4a02df5..cfc6b2db103b 100644 --- a/packages/camera/camera_android_camerax/test/preview_rotation_test.dart +++ b/packages/camera/camera_android_camerax/test/preview_rotation_test.dart @@ -54,6 +54,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera({ required MockCameraSelector mockCameraSelector, required int sensorRotationDegrees, + required bool isCameraFrontFacing, }) { final mockProcessCameraProvider = MockProcessCameraProvider(); final mockCameraInfo = MockCameraInfo(); @@ -68,8 +69,8 @@ void main() { mockProcessCameraProvider.getAvailableCameraInfos(), ).thenAnswer((_) async => [mockCameraInfo]); when( - mockCameraSelector.filter([mockCameraInfo]), - ).thenAnswer((_) async => [mockCameraInfo]); + mockCameraInfo.lensFacing, + ).thenReturn(isCameraFrontFacing ? LensFacing.front : LensFacing.back); when( mockCameraInfo.sensorRotationDegrees, ).thenReturn(sensorRotationDegrees); @@ -382,6 +383,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera( mockCameraSelector: mockCameraSelector, sensorRotationDegrees: /* irrelevant for test */ 90, + isCameraFrontFacing: false, ); fakeCreateCameraSelector = createCameraSelectorForBackCamera( mockCameraSelector, @@ -633,6 +635,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera( mockCameraSelector: mockCameraSelector, sensorRotationDegrees: /* irrelevant for test */ 90, + isCameraFrontFacing: false, ); fakeCreateCameraSelector = createCameraSelectorForBackCamera( mockCameraSelector, @@ -879,6 +882,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera( mockCameraSelector: mockFrontCameraSelector, sensorRotationDegrees: 270, + isCameraFrontFacing: false, ); const testMediaSettings = MediaSettings(); @@ -984,6 +988,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera( mockCameraSelector: mockFrontCameraSelector, sensorRotationDegrees: 270, + isCameraFrontFacing: true, ); const testMediaSettings = MediaSettings(); @@ -1089,6 +1094,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera( mockCameraSelector: mockFrontCameraSelector, sensorRotationDegrees: 270, + isCameraFrontFacing: true, ); proxyGetDefaultDisplayRotation = () => Future.value(Surface.rotation0); @@ -1373,6 +1379,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera( mockCameraSelector: mockFrontCameraSelector, sensorRotationDegrees: 270, + isCameraFrontFacing: true, ); proxyGetUiOrientation = () async => _serializeDeviceOrientation(DeviceOrientation.landscapeLeft); @@ -1660,6 +1667,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera( mockCameraSelector: mockFrontCameraSelector, sensorRotationDegrees: 270, + isCameraFrontFacing: true, ); const testMediaSettings = MediaSettings(); @@ -1775,6 +1783,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera( mockCameraSelector: mockFrontCameraSelector, sensorRotationDegrees: 90, + isCameraFrontFacing: true, ); // Media settings to create camera; irrelevant for test. @@ -1913,6 +1922,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera( mockCameraSelector: mockBackCameraSelector, sensorRotationDegrees: 90, + isCameraFrontFacing: false, ); // Set up test to use back camera, tell camera that handlesCropAndRotation is false, @@ -1973,6 +1983,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera( mockCameraSelector: mockBackCameraSelector, sensorRotationDegrees: 270, + isCameraFrontFacing: false, ); // Set up test to use back camera, tell camera that handlesCropAndRotation is false, @@ -2061,6 +2072,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera( mockCameraSelector: mockFrontCameraSelector, sensorRotationDegrees: testSensorOrientation, + isCameraFrontFacing: true, ); // Set up front camera selection and initial device orientation as landscape right. final MockCameraSelector Function({ @@ -2135,6 +2147,7 @@ void main() { setUpMockCameraSelectorAndMockProcessCameraProviderForSelectingTestCamera( mockCameraSelector: mockBackCameraSelector, sensorRotationDegrees: testSensorOrientation, + isCameraFrontFacing: false, ); // Set up front camera selection and initial device orientation as landscape right.