From f2946255a3b1562e1ce2de60f7d98ecfad1ff3a6 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Wed, 29 Mar 2023 17:46:55 +0300 Subject: [PATCH 001/108] added MediaSettings --- .../camera_platform_interface/CHANGELOG.md | 5 ++ .../lib/camera_platform_interface.dart | 1 + .../method_channel/method_channel_camera.dart | 11 ++-- .../platform_interface/camera_platform.dart | 4 +- .../lib/src/types/media_settings.dart | 59 +++++++++++++++++++ .../lib/src/types/types.dart | 1 + .../camera_platform_interface/pubspec.yaml | 2 +- .../test/camera_platform_interface_test.dart | 2 +- .../method_channel_camera_test.dart | 19 +++--- 9 files changed, 88 insertions(+), 16 deletions(-) create mode 100644 packages/camera/camera_platform_interface/lib/src/types/media_settings.dart diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index e0736cac6a0..51a3c544e0d 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,3 +1,8 @@ +## 2.6.0 + +* [camera] MediaSettings are introduced to manage fps and bitrate of recorded video. +* Aligns Dart and Flutter SDK constraints. + ## 2.5.0 * Adds NV21 as an image stream format (suitable for Android). diff --git a/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart b/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart index 6fab99b3d69..25fc417a9cc 100644 --- a/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart +++ b/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart @@ -8,4 +8,5 @@ export 'package:cross_file/cross_file.dart'; export 'src/events/camera_event.dart'; export 'src/events/device_event.dart'; export 'src/platform_interface/camera_platform.dart'; +export 'src/types/media_settings.dart'; export 'src/types/types.dart'; diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index 14d20fc817b..9f5d59cd023 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -85,17 +85,20 @@ class MethodChannelCamera extends CameraPlatform { @override Future createCamera( - CameraDescription cameraDescription, - ResolutionPreset? resolutionPreset, { + CameraDescription cameraDescription, { + MediaSettings? mediaSettings, bool enableAudio = false, }) async { try { final Map? reply = await _channel .invokeMapMethod('create', { 'cameraName': cameraDescription.name, - 'resolutionPreset': resolutionPreset != null - ? _serializeResolutionPreset(resolutionPreset) + 'resolutionPreset': null != mediaSettings?.resolutionPreset + ? _serializeResolutionPreset(mediaSettings!.resolutionPreset!) : null, + 'fps': mediaSettings?.fps, + 'videoBitrate': mediaSettings?.videoBitrate, + 'audioBitrate': mediaSettings?.audioBitrate, 'enableAudio': enableAudio, }); diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index b43629d4e0c..f66d808cfef 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -48,8 +48,8 @@ abstract class CameraPlatform extends PlatformInterface { /// Creates an uninitialized camera instance and returns the cameraId. Future createCamera( - CameraDescription cameraDescription, - ResolutionPreset? resolutionPreset, { + CameraDescription cameraDescription, { + MediaSettings? mediaSettings, bool enableAudio = false, }) { throw UnimplementedError('createCamera() is not implemented.'); diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart new file mode 100644 index 00000000000..70b2150c291 --- /dev/null +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -0,0 +1,59 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// ignore_for_file: avoid_equals_and_hash_code_on_mutable_classes + +import 'resolution_preset.dart'; + +/// recording media settings. +class MediaSettings { + /// constructor + const MediaSettings({ + this.resolutionPreset, + this.fps, + this.videoBitrate, + this.audioBitrate, + }); + + /// Default low quality factory + static MediaSettings low() => const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ); + + /// resolution preset + final ResolutionPreset? resolutionPreset; + + /// camera fps + final int? fps; + + /// recording video bitrate + final int? videoBitrate; + + /// recording audio bitrate + final int? audioBitrate; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is MediaSettings && + runtimeType == other.runtimeType && + resolutionPreset == other.resolutionPreset && + fps == other.fps && + videoBitrate == other.videoBitrate && + audioBitrate == other.audioBitrate; + + @override + int get hashCode => + resolutionPreset.hashCode ^ + fps.hashCode ^ + videoBitrate.hashCode ^ + audioBitrate.hashCode; + + @override + String toString() => + 'MediaSettings{resolutionPreset: $resolutionPreset, fps: $fps, videoBitrate: $videoBitrate, audioBitrate: $audioBitrate}'; +} diff --git a/packages/camera/camera_platform_interface/lib/src/types/types.dart b/packages/camera/camera_platform_interface/lib/src/types/types.dart index a8a4f8ca5dc..f9a81559d68 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/types.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/types.dart @@ -9,5 +9,6 @@ export 'exposure_mode.dart'; export 'flash_mode.dart'; export 'focus_mode.dart'; export 'image_format_group.dart'; +export 'media_settings.dart'; export 'resolution_preset.dart'; export 'video_capture_options.dart'; diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 7c3da2d4fc8..40e83350541 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.5.0 +version: 2.6.0 environment: sdk: ">=2.17.0 <4.0.0" diff --git a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart index e3b6858e6d2..69749a803c3 100644 --- a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart +++ b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart @@ -163,7 +163,7 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + mediaSettings: MediaSettings.low(), ), throwsUnimplementedError, ); diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index b01123d7cb2..61f7e033e61 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -38,7 +38,7 @@ void main() { name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0), - ResolutionPreset.high, + mediaSettings: MediaSettings.low(), ); // Assert @@ -47,7 +47,10 @@ void main() { 'create', arguments: { 'cameraName': 'Test', - 'resolutionPreset': 'high', + 'resolutionPreset': 'low', + 'fps': 15, + 'videoBitrate': 200000, + 'audioBitrate': 32000, 'enableAudio': false }, ), @@ -77,7 +80,7 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + mediaSettings: MediaSettings.low(), ), throwsA( isA() @@ -111,7 +114,7 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + mediaSettings: MediaSettings.low(), ), throwsA( isA() @@ -173,7 +176,7 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + mediaSettings: MediaSettings.low(), ); // Act @@ -220,7 +223,7 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + mediaSettings: MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -268,7 +271,7 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + mediaSettings: MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -438,7 +441,7 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + mediaSettings: MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add( From 5ca79b9d79dd523b0ff578b170fa0e42f409b479 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Wed, 29 Mar 2023 17:50:30 +0300 Subject: [PATCH 002/108] updated changelog --- .../camera_platform_interface/CHANGELOG.md | 5 ++-- .../method_channel/method_channel_camera.dart | 9 +++--- .../platform_interface/camera_platform.dart | 22 ++++++++++++--- .../lib/src/types/media_settings.dart | 12 ++++++-- .../camera_platform_interface/pubspec.yaml | 2 +- .../test/camera_platform_interface_test.dart | 4 +-- .../method_channel_camera_test.dart | 28 +++++++++---------- 7 files changed, 50 insertions(+), 32 deletions(-) diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index 51a3c544e0d..3741d8d4bfe 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,7 +1,6 @@ -## 2.6.0 +## 2.5.1 -* [camera] MediaSettings are introduced to manage fps and bitrate of recorded video. -* Aligns Dart and Flutter SDK constraints. +* CameraPlatform.createCameraWithSettings method for tune fps and bitrate of recorded video. ## 2.5.0 diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index 9f5d59cd023..fbd80bcb9a7 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -84,11 +84,10 @@ class MethodChannelCamera extends CameraPlatform { } @override - Future createCamera( - CameraDescription cameraDescription, { + Future createCameraWithSettings( + CameraDescription cameraDescription, MediaSettings? mediaSettings, - bool enableAudio = false, - }) async { + ) async { try { final Map? reply = await _channel .invokeMapMethod('create', { @@ -99,7 +98,7 @@ class MethodChannelCamera extends CameraPlatform { 'fps': mediaSettings?.fps, 'videoBitrate': mediaSettings?.videoBitrate, 'audioBitrate': mediaSettings?.audioBitrate, - 'enableAudio': enableAudio, + 'enableAudio': mediaSettings?.enableAudio ?? false, }); return reply!['cameraId']! as int; diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index f66d808cfef..b3bd4f7278a 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -47,12 +47,26 @@ abstract class CameraPlatform extends PlatformInterface { } /// Creates an uninitialized camera instance and returns the cameraId. + /// Method will be deprecated. Use [createCameraWithSettings]. Future createCamera( - CameraDescription cameraDescription, { - MediaSettings? mediaSettings, + CameraDescription cameraDescription, + ResolutionPreset? resolutionPreset, { bool enableAudio = false, - }) { - throw UnimplementedError('createCamera() is not implemented.'); + }) => + createCameraWithSettings( + cameraDescription, + MediaSettings( + resolutionPreset: resolutionPreset, + enableAudio: enableAudio, + ), + ); + + /// Creates an uninitialized camera instance and returns the cameraId. + Future createCameraWithSettings( + CameraDescription cameraDescription, + MediaSettings? mediaSettings, + ) { + throw UnimplementedError('createCameraWithSettings() is not implemented.'); } /// Initializes the camera on the device. diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart index 70b2150c291..45f56b12338 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -14,6 +14,7 @@ class MediaSettings { this.fps, this.videoBitrate, this.audioBitrate, + this.enableAudio = false, }); /// Default low quality factory @@ -36,6 +37,9 @@ class MediaSettings { /// recording audio bitrate final int? audioBitrate; + /// enable audio + final bool enableAudio; + @override bool operator ==(Object other) => identical(this, other) || @@ -44,16 +48,18 @@ class MediaSettings { resolutionPreset == other.resolutionPreset && fps == other.fps && videoBitrate == other.videoBitrate && - audioBitrate == other.audioBitrate; + audioBitrate == other.audioBitrate && + enableAudio == other.enableAudio; @override int get hashCode => resolutionPreset.hashCode ^ fps.hashCode ^ videoBitrate.hashCode ^ - audioBitrate.hashCode; + audioBitrate.hashCode ^ + enableAudio.hashCode; @override String toString() => - 'MediaSettings{resolutionPreset: $resolutionPreset, fps: $fps, videoBitrate: $videoBitrate, audioBitrate: $audioBitrate}'; + 'MediaSettings{resolutionPreset: $resolutionPreset, fps: $fps, videoBitrate: $videoBitrate, audioBitrate: $audioBitrate, enableAudio: $enableAudio}'; } diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 40e83350541..93b10fca061 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.6.0 +version: 2.5.1 environment: sdk: ">=2.17.0 <4.0.0" diff --git a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart index 69749a803c3..d08f5921c54 100644 --- a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart +++ b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart @@ -157,13 +157,13 @@ void main() { // Act & Assert expect( - () => cameraPlatform.createCamera( + () => cameraPlatform.createCameraWithSettings( const CameraDescription( name: 'back', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - mediaSettings: MediaSettings.low(), + MediaSettings.low(), ), throwsUnimplementedError, ); diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index 61f7e033e61..34db7a1033e 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -33,12 +33,12 @@ void main() { final MethodChannelCamera camera = MethodChannelCamera(); // Act - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0), - mediaSettings: MediaSettings.low(), + MediaSettings.low(), ); // Assert @@ -74,13 +74,13 @@ void main() { // Act expect( - () => camera.createCamera( + () => camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - mediaSettings: MediaSettings.low(), + MediaSettings.low(), ), throwsA( isA() @@ -108,13 +108,13 @@ void main() { // Act expect( - () => camera.createCamera( + () => camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - mediaSettings: MediaSettings.low(), + MediaSettings.low(), ), throwsA( isA() @@ -170,13 +170,13 @@ void main() { 'initialize': null }); final MethodChannelCamera camera = MethodChannelCamera(); - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - mediaSettings: MediaSettings.low(), + MediaSettings.low(), ); // Act @@ -217,13 +217,13 @@ void main() { }); final MethodChannelCamera camera = MethodChannelCamera(); - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - mediaSettings: MediaSettings.low(), + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -265,13 +265,13 @@ void main() { }, ); camera = MethodChannelCamera(); - cameraId = await camera.createCamera( + cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - mediaSettings: MediaSettings.low(), + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -435,13 +435,13 @@ void main() { }, ); camera = MethodChannelCamera(); - cameraId = await camera.createCamera( + cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - mediaSettings: MediaSettings.low(), + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add( From e08e0464c65bab6e834feddebc2b2b83e623310f Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Thu, 30 Mar 2023 01:12:27 +0300 Subject: [PATCH 003/108] MediaSettings introduced. --- packages/camera/camera/README.md | 6 +- .../example/integration_test/camera_test.dart | 32 ++- packages/camera/camera/example/lib/main.dart | 6 +- .../example/lib/readme_full_example.dart | 6 +- packages/camera/camera/example/pubspec.yaml | 17 ++ .../camera/lib/src/camera_controller.dart | 30 ++- .../camera/camera/lib/src/camera_preview.dart | 5 +- packages/camera/camera/pubspec.yaml | 5 + .../camera/test/camera_image_stream_test.dart | 36 +-- .../camera/test/camera_preview_test.dart | 12 +- packages/camera/camera/test/camera_test.dart | 233 +++++++++--------- .../camera_android/android/build.gradle | 2 +- .../io/flutter/plugins/camera/Camera.java | 48 +++- .../plugins/camera/MethodCallHandlerImpl.java | 8 +- .../camera/features/CameraFeatures.java | 28 +++ .../features/fpsrange/FpsRangeFeature.java | 3 +- .../features/intfeature/IntFeature.java | 43 ++++ .../camera/media/MediaRecorderBuilder.java | 68 ++++- .../io/flutter/plugins/camera/CameraTest.java | 10 +- .../CameraTest_getRecordingProfileTest.java | 5 +- .../media/MediaRecorderBuilderTest.java | 57 +++-- .../android/app/src/main/AndroidManifest.xml | 1 + .../example/android/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../example/android/settings.gradle | 12 +- .../example/lib/camera_controller.dart | 12 +- .../camera_android/example/pubspec.yaml | 10 + .../lib/src/android_camera.dart | 15 +- packages/camera/camera_android/pubspec.yaml | 5 + .../test/android_camera_test.dart | 33 +-- .../android/build.gradle | 2 +- .../example/android/build.gradle | 2 +- .../integration_test/integration_test.dart | 4 +- .../example/lib/camera_controller.dart | 20 +- .../example/lib/main.dart | 3 +- .../example/pubspec.yaml | 10 + .../lib/src/android_camera_camerax.dart | 19 +- .../camera_android_camerax/pubspec.yaml | 5 + .../test/android_camera_camerax_test.dart | 22 +- .../example/integration_test/camera_test.dart | 48 ++-- .../ios/Runner.xcodeproj/project.pbxproj | 27 +- ...eraCaptureSessionQueueRaceConditionTests.m | 12 +- .../RunnerTests/CameraMethodChannelTests.m | 11 +- .../example/ios/RunnerTests/CameraTestUtils.m | 3 + .../example/lib/camera_controller.dart | 37 ++- .../camera_avfoundation/example/lib/main.dart | 10 +- .../camera_avfoundation/example/pubspec.yaml | 11 + .../ios/Classes/CameraPlugin.m | 6 + .../camera_avfoundation/ios/Classes/FLTCam.h | 3 + .../camera_avfoundation/ios/Classes/FLTCam.m | 56 ++++- .../ios/Classes/FLTCam_Test.h | 3 + .../lib/src/avfoundation_camera.dart | 16 +- .../camera/camera_avfoundation/pubspec.yaml | 5 + .../test/avfoundation_camera_test.dart | 33 +-- .../camera_platform_interface/CHANGELOG.md | 4 - .../lib/src/types/media_settings.dart | 3 +- .../camera_platform_interface/pubspec.yaml | 2 +- .../method_channel_camera_test.dart | 2 +- .../integration_test/camera_options_test.dart | 9 +- .../integration_test/camera_web_test.dart | 18 +- .../camera/camera_web/example/pubspec.yaml | 13 +- .../camera/camera_web/lib/src/camera.dart | 5 + .../camera_web/lib/src/camera_service.dart | 34 +++ .../camera/camera_web/lib/src/camera_web.dart | 15 +- .../lib/src/types/camera_options.dart | 56 +++-- packages/camera/camera_web/pubspec.yaml | 5 + .../camera_windows/example/lib/main.dart | 28 ++- .../camera_windows/example/pubspec.yaml | 10 + .../camera_windows/lib/camera_windows.dart | 16 +- packages/camera/camera_windows/pubspec.yaml | 5 + .../test/camera_windows_test.dart | 30 ++- .../camera/camera_windows/windows/camera.cpp | 12 +- .../camera/camera_windows/windows/camera.h | 10 +- .../camera_windows/windows/camera_plugin.cpp | 17 +- .../windows/capture_controller.cpp | 9 +- .../windows/capture_controller.h | 9 +- .../camera_windows/windows/record_handler.cpp | 28 +++ .../camera_windows/windows/record_handler.h | 10 +- .../windows/test/camera_plugin_test.cpp | 3 +- .../windows/test/camera_test.cpp | 7 +- .../windows/test/capture_controller_test.cpp | 12 +- .../camera_windows/windows/test/mocks.h | 6 +- 82 files changed, 1050 insertions(+), 448 deletions(-) create mode 100644 packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java diff --git a/packages/camera/camera/README.md b/packages/camera/camera/README.md index db70831aef1..4e43c3f56de 100644 --- a/packages/camera/camera/README.md +++ b/packages/camera/camera/README.md @@ -100,6 +100,7 @@ Here is a small example flutter app displaying a full screen camera preview. ```dart import 'package:camera/camera.dart'; +import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/material.dart'; late List _cameras; @@ -126,7 +127,10 @@ class _CameraAppState extends State { @override void initState() { super.initState(); - controller = CameraController(_cameras[0], ResolutionPreset.max); + controller = CameraController( + _cameras[0], + mediaSettings: MediaSettings.low(), + ); controller.initialize().then((_) { if (!mounted) { return; diff --git a/packages/camera/camera/example/integration_test/camera_test.dart b/packages/camera/camera/example/integration_test/camera_test.dart index f0cc67f0c06..831822bbe35 100644 --- a/packages/camera/camera/example/integration_test/camera_test.dart +++ b/packages/camera/camera/example/integration_test/camera_test.dart @@ -7,6 +7,7 @@ import 'dart:io'; import 'dart:ui'; import 'package:camera/camera.dart'; +import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/painting.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; @@ -80,8 +81,12 @@ void main() { bool previousPresetExactlySupported = true; for (final MapEntry preset in presetExpectedSizes.entries) { - final CameraController controller = - CameraController(cameraDescription, preset.key); + final CameraController controller = CameraController.withSettings( + cameraDescription, + mediaSettings: MediaSettings( + resolutionPreset: preset.key, + ), + ); await controller.initialize(); final bool presetExactlySupported = await testCaptureImageResolution(controller, preset.key); @@ -132,8 +137,12 @@ void main() { bool previousPresetExactlySupported = true; for (final MapEntry preset in presetExpectedSizes.entries) { - final CameraController controller = - CameraController(cameraDescription, preset.key); + final CameraController controller = CameraController.withSettings( + cameraDescription, + mediaSettings: MediaSettings( + resolutionPreset: preset.key, + ), + ); await controller.initialize(); await controller.prepareForVideoRecording(); final bool presetExactlySupported = @@ -155,10 +164,9 @@ void main() { return; } - final CameraController controller = CameraController( + final CameraController controller = CameraController.withSettings( cameras[0], - ResolutionPreset.low, - enableAudio: false, + mediaSettings: MediaSettings.low(enableAudio: false), ); await controller.initialize(); @@ -210,10 +218,9 @@ void main() { return; } - final CameraController controller = CameraController( + final CameraController controller = CameraController.withSettings( cameras[0], - ResolutionPreset.low, - enableAudio: false, + mediaSettings: MediaSettings.low(enableAudio: false), ); await controller.initialize(); @@ -242,10 +249,9 @@ void main() { /// Start streaming with specifying the ImageFormatGroup. Future startStreaming(List cameras, ImageFormatGroup? imageFormatGroup) async { - final CameraController controller = CameraController( + final CameraController controller = CameraController.withSettings( cameras.first, - ResolutionPreset.low, - enableAudio: false, + mediaSettings: MediaSettings.low(enableAudio: false), imageFormatGroup: imageFormatGroup, ); diff --git a/packages/camera/camera/example/lib/main.dart b/packages/camera/camera/example/lib/main.dart index 2fa2ae6de2d..b10c5f8ae22 100644 --- a/packages/camera/camera/example/lib/main.dart +++ b/packages/camera/camera/example/lib/main.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:io'; import 'package:camera/camera.dart'; +import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; @@ -644,10 +645,9 @@ class _CameraExampleHomeState extends State await oldController.dispose(); } - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( cameraDescription, - kIsWeb ? ResolutionPreset.max : ResolutionPreset.medium, - enableAudio: enableAudio, + mediaSettings: MediaSettings.low(enableAudio: enableAudio), imageFormatGroup: ImageFormatGroup.jpeg, ); diff --git a/packages/camera/camera/example/lib/readme_full_example.dart b/packages/camera/camera/example/lib/readme_full_example.dart index 0a7c418f4c5..87ce86bbc3c 100644 --- a/packages/camera/camera/example/lib/readme_full_example.dart +++ b/packages/camera/camera/example/lib/readme_full_example.dart @@ -4,6 +4,7 @@ // #docregion FullAppExample import 'package:camera/camera.dart'; +import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/material.dart'; late List _cameras; @@ -30,7 +31,10 @@ class _CameraAppState extends State { @override void initState() { super.initState(); - controller = CameraController(_cameras[0], ResolutionPreset.max); + controller = CameraController.withSettings( + _cameras[0], + mediaSettings: MediaSettings.low(), + ); controller.initialize().then((_) { if (!mounted) { return; diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index eaf2bd19238..eb670ea616c 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -14,11 +14,28 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + camera_platform_interface: + path: ../../camera_platform_interface flutter: sdk: flutter path_provider: ^2.0.0 video_player: ^2.1.4 + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + + camera_android: + path: ../../../camera/camera_android + camera_avfoundation: + path: ../../../camera/camera_avfoundation + camera_platform_interface: + path: ../../../camera/camera_platform_interface + camera_web: + path: ../../../camera/camera_web + + dev_dependencies: build_runner: ^2.1.10 flutter_driver: diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index 7a396c1589f..4aa7293f9a5 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -224,26 +224,33 @@ class CameraValue { /// To show the camera preview on the screen use a [CameraPreview] widget. class CameraController extends ValueNotifier { /// Creates a new camera controller in an uninitialized state. + /// Deprecated, use [withSettings]. CameraController( this.description, - this.resolutionPreset, { - this.enableAudio = true, + ResolutionPreset resolutionPreset, { + bool enableAudio = true, + this.imageFormatGroup, + }) : mediaSettings = MediaSettings( + resolutionPreset: resolutionPreset, enableAudio: enableAudio), + super(const CameraValue.uninitialized()); + + /// Creates a new camera controller in an uninitialized state, using specified media settings like fps and bitrate. + CameraController.withSettings( + this.description, { + this.mediaSettings, this.imageFormatGroup, }) : super(const CameraValue.uninitialized()); /// The properties of the camera device controlled by this controller. final CameraDescription description; - /// The resolution this controller is targeting. + /// The media settings this controller is targeting. /// - /// This resolution preset is not guaranteed to be available on the device, + /// This media settings are not guaranteed to be available on the device, /// if unavailable a lower resolution will be used. /// - /// See also: [ResolutionPreset]. - final ResolutionPreset resolutionPreset; - - /// Whether to include audio when recording a video. - final bool enableAudio; + /// See also: [MediaSettings]. + final MediaSettings? mediaSettings; /// The [ImageFormatGroup] describes the output of the raw image format. /// @@ -293,10 +300,9 @@ class CameraController extends ValueNotifier { ); }); - _cameraId = await CameraPlatform.instance.createCamera( + _cameraId = await CameraPlatform.instance.createCameraWithSettings( description, - resolutionPreset, - enableAudio: enableAudio, + mediaSettings, ); _unawaited(CameraPlatform.instance diff --git a/packages/camera/camera/lib/src/camera_preview.dart b/packages/camera/camera/lib/src/camera_preview.dart index 53f9034dc85..f081a1fa2db 100644 --- a/packages/camera/camera/lib/src/camera_preview.dart +++ b/packages/camera/camera/lib/src/camera_preview.dart @@ -21,7 +21,7 @@ class CameraPreview extends StatelessWidget { @override Widget build(BuildContext context) { - return controller.value.isInitialized + return (controller.value.isInitialized && !controller.value.isPreviewPaused) ? ValueListenableBuilder( valueListenable: controller, builder: (BuildContext context, Object? value, Widget? child) { @@ -32,7 +32,8 @@ class CameraPreview extends StatelessWidget { child: Stack( fit: StackFit.expand, children: [ - _wrapInRotatedBox(child: controller.buildPreview()), + if (!controller.value.isPreviewPaused) + _wrapInRotatedBox(child: controller.buildPreview()), child ?? Container(), ], ), diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index f623b88214c..feaa2739c0f 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -38,3 +38,8 @@ dev_dependencies: mockito: 5.3.2 plugin_platform_interface: ^2.0.0 video_player: ^2.0.0 + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {camera_android: {path: ../../camera/camera_android}, camera_avfoundation: {path: ../../camera/camera_avfoundation}, camera_platform_interface: {path: ../../camera/camera_platform_interface}, camera_web: {path: ../../camera/camera_web}} diff --git a/packages/camera/camera/test/camera_image_stream_test.dart b/packages/camera/camera/test/camera_image_stream_test.dart index 29b5cceaa49..39f4d436456 100644 --- a/packages/camera/camera/test/camera_image_stream_test.dart +++ b/packages/camera/camera/test/camera_image_stream_test.dart @@ -20,12 +20,12 @@ void main() { }); test('startImageStream() throws $CameraException when uninitialized', () { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); expect( () => cameraController.startImageStream((CameraImage image) => null), @@ -47,12 +47,12 @@ void main() { test('startImageStream() throws $CameraException when recording videos', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); @@ -70,12 +70,12 @@ void main() { test( 'startImageStream() throws $CameraException when already streaming images', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); cameraController.value = @@ -90,12 +90,12 @@ void main() { }); test('startImageStream() calls CameraPlatform', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); await cameraController.startImageStream((CameraImage image) => null); @@ -105,12 +105,12 @@ void main() { }); test('stopImageStream() throws $CameraException when uninitialized', () { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); expect( cameraController.stopImageStream, @@ -132,12 +132,12 @@ void main() { test('stopImageStream() throws $CameraException when not streaming images', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); expect( @@ -150,12 +150,12 @@ void main() { }); test('stopImageStream() intended behaviour', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); await cameraController.startImageStream((CameraImage image) => null); await cameraController.stopImageStream(); @@ -165,12 +165,12 @@ void main() { }); test('startVideoRecording() can stream images', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); @@ -183,12 +183,12 @@ void main() { }); test('startVideoRecording() by default does not stream', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); diff --git a/packages/camera/camera/test/camera_preview_test.dart b/packages/camera/camera/test/camera_preview_test.dart index 6677fcf9039..416aa9dfb7e 100644 --- a/packages/camera/camera/test/camera_preview_test.dart +++ b/packages/camera/camera/test/camera_preview_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'package:camera/camera.dart'; +import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -33,9 +34,6 @@ class FakeController extends ValueNotifier CameraDescription get description => const CameraDescription( name: '', lensDirection: CameraLensDirection.back, sensorOrientation: 0); - @override - bool get enableAudio => false; - @override Future getExposureOffsetStepSize() async => 1.0; @@ -67,7 +65,13 @@ class FakeController extends ValueNotifier Future prepareForVideoRecording() async {} @override - ResolutionPreset get resolutionPreset => ResolutionPreset.low; + MediaSettings get mediaSettings => const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ); @override Future resumeVideoRecording() async {} diff --git a/packages/camera/camera/test/camera_test.dart b/packages/camera/camera/test/camera_test.dart index ab8354f7ba0..7f22f004746 100644 --- a/packages/camera/camera/test/camera_test.dart +++ b/packages/camera/camera/test/camera_test.dart @@ -59,9 +59,9 @@ void main() { test('debugCheckIsDisposed should not throw assertion error when disposed', () { const MockCameraDescription description = MockCameraDescription(); - final CameraController controller = CameraController( + final CameraController controller = CameraController.withSettings( description, - ResolutionPreset.low, + mediaSettings: MediaSettings.low(), ); controller.dispose(); @@ -72,9 +72,9 @@ void main() { test('debugCheckIsDisposed should throw assertion error when not disposed', () { const MockCameraDescription description = MockCameraDescription(); - final CameraController controller = CameraController( + final CameraController controller = CameraController.withSettings( description, - ResolutionPreset.low, + mediaSettings: MediaSettings.low(), ); expect( @@ -98,12 +98,26 @@ void main() { }); test('Can be initialized', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); + await cameraController.initialize(); + + expect(cameraController.value.aspectRatio, 1); + expect(cameraController.value.previewSize, const Size(75, 75)); + expect(cameraController.value.isInitialized, isTrue); + }); + + test('Can be initialized with default parameters', () async { + final CameraController cameraController = CameraController.withSettings( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ); await cameraController.initialize(); expect(cameraController.value.aspectRatio, 1); @@ -112,12 +126,12 @@ void main() { }); test('can be disposed', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); expect(cameraController.value.aspectRatio, 1); @@ -130,12 +144,12 @@ void main() { }); test('initialize() throws CameraException when disposed', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); expect(cameraController.value.aspectRatio, 1); @@ -157,12 +171,12 @@ void main() { test('initialize() throws $CameraException on $PlatformException ', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); mockPlatformException = true; @@ -178,12 +192,12 @@ void main() { test('initialize() sets imageFormat', () async { debugDefaultTargetPlatformOverride = TargetPlatform.android; - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max, + mediaSettings: MediaSettings.low(), imageFormatGroup: ImageFormatGroup.yuv420, ); await cameraController.initialize(); @@ -193,12 +207,12 @@ void main() { }); test('prepareForVideoRecording() calls $CameraPlatform ', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); await cameraController.prepareForVideoRecording(); @@ -207,12 +221,12 @@ void main() { }); test('takePicture() throws $CameraException when uninitialized ', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); expect( cameraController.takePicture(), throwsA( @@ -233,12 +247,12 @@ void main() { test('takePicture() throws $CameraException when takePicture is true', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); cameraController.value = @@ -253,12 +267,12 @@ void main() { }); test('takePicture() returns $XFile', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); final XFile xFile = await cameraController.takePicture(); @@ -267,12 +281,12 @@ void main() { test('takePicture() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); mockPlatformException = true; @@ -288,12 +302,12 @@ void main() { test('startVideoRecording() throws $CameraException when uninitialized', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); expect( cameraController.startVideoRecording(), @@ -314,12 +328,12 @@ void main() { }); test('startVideoRecording() throws $CameraException when recording videos', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); @@ -337,12 +351,12 @@ void main() { test('getMaxZoomLevel() throws $CameraException when uninitialized', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); expect( cameraController.getMaxZoomLevel, @@ -363,12 +377,12 @@ void main() { }); test('getMaxZoomLevel() throws $CameraException when disposed', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); await cameraController.dispose(); @@ -394,12 +408,12 @@ void main() { test( 'getMaxZoomLevel() throws $CameraException when a platform exception occured.', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance.getMaxZoomLevel(mockInitializeCamera)) @@ -421,12 +435,12 @@ void main() { }); test('getMaxZoomLevel() returns max zoom level.', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance.getMaxZoomLevel(mockInitializeCamera)) @@ -438,12 +452,12 @@ void main() { test('getMinZoomLevel() throws $CameraException when uninitialized', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); expect( cameraController.getMinZoomLevel, @@ -464,12 +478,12 @@ void main() { }); test('getMinZoomLevel() throws $CameraException when disposed', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); await cameraController.dispose(); @@ -495,12 +509,12 @@ void main() { test( 'getMinZoomLevel() throws $CameraException when a platform exception occured.', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance.getMinZoomLevel(mockInitializeCamera)) @@ -522,12 +536,12 @@ void main() { }); test('getMinZoomLevel() returns max zoom level.', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance.getMinZoomLevel(mockInitializeCamera)) @@ -538,12 +552,12 @@ void main() { }); test('setZoomLevel() throws $CameraException when uninitialized', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); expect( () => cameraController.setZoomLevel(42.0), @@ -564,12 +578,12 @@ void main() { }); test('setZoomLevel() throws $CameraException when disposed', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); await cameraController.dispose(); @@ -595,12 +609,12 @@ void main() { test( 'setZoomLevel() throws $CameraException when a platform exception occured.', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance.setZoomLevel(mockInitializeCamera, 42.0)) @@ -626,12 +640,12 @@ void main() { test( 'setZoomLevel() completes and calls method channel with correct value.', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); await cameraController.setZoomLevel(42.0); @@ -641,12 +655,12 @@ void main() { }); test('setFlashMode() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); await cameraController.setFlashMode(FlashMode.always); @@ -658,12 +672,12 @@ void main() { test('setFlashMode() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance @@ -685,12 +699,12 @@ void main() { }); test('setExposureMode() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); await cameraController.setExposureMode(ExposureMode.auto); @@ -702,12 +716,12 @@ void main() { test('setExposureMode() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance @@ -729,12 +743,12 @@ void main() { }); test('setExposurePoint() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); await cameraController.setExposurePoint(const Offset(0.5, 0.5)); @@ -746,12 +760,12 @@ void main() { test('setExposurePoint() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance.setExposurePoint( @@ -773,12 +787,12 @@ void main() { }); test('getMinExposureOffset() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance @@ -794,12 +808,12 @@ void main() { test('getMinExposureOffset() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance @@ -821,12 +835,12 @@ void main() { }); test('getMaxExposureOffset() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance @@ -842,12 +856,12 @@ void main() { test('getMaxExposureOffset() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance @@ -869,12 +883,12 @@ void main() { }); test('getExposureOffsetStepSize() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance @@ -891,12 +905,12 @@ void main() { test( 'getExposureOffsetStepSize() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance @@ -918,12 +932,12 @@ void main() { }); test('setExposureOffset() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance .getMinExposureOffset(cameraController.cameraId)) @@ -947,12 +961,12 @@ void main() { test('setExposureOffset() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance .getMinExposureOffset(cameraController.cameraId)) @@ -984,12 +998,12 @@ void main() { test( 'setExposureOffset() throws $CameraException when offset is out of bounds', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance .getMinExposureOffset(cameraController.cameraId)) @@ -1041,12 +1055,12 @@ void main() { }); test('setExposureOffset() rounds offset to nearest step', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance .getMinExposureOffset(cameraController.cameraId)) @@ -1115,12 +1129,12 @@ void main() { }); test('pausePreview() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); cameraController.value = cameraController.value .copyWith(deviceOrientation: DeviceOrientation.portraitUp); @@ -1136,12 +1150,12 @@ void main() { test('pausePreview() does not call $CameraPlatform when already paused', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith(isPreviewPaused: true); @@ -1156,12 +1170,12 @@ void main() { test( 'pausePreview() sets previewPauseOrientation according to locked orientation', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith( isPreviewPaused: false, @@ -1179,12 +1193,12 @@ void main() { test('pausePreview() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance.pausePreview(cameraController.cameraId)) .thenThrow( @@ -1204,12 +1218,12 @@ void main() { }); test('resumePreview() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith(isPreviewPaused: true); @@ -1223,12 +1237,12 @@ void main() { test('resumePreview() does not call $CameraPlatform when not paused', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith(isPreviewPaused: false); @@ -1242,12 +1256,12 @@ void main() { test('resumePreview() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith(isPreviewPaused: true); @@ -1269,12 +1283,12 @@ void main() { }); test('lockCaptureOrientation() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); await cameraController.lockCaptureOrientation(); @@ -1296,12 +1310,12 @@ void main() { test( 'lockCaptureOrientation() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance.lockCaptureOrientation( cameraController.cameraId, DeviceOrientation.portraitUp)) @@ -1322,12 +1336,12 @@ void main() { }); test('unlockCaptureOrientation() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); await cameraController.unlockCaptureOrientation(); @@ -1341,12 +1355,12 @@ void main() { test( 'unlockCaptureOrientation() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - ResolutionPreset.max); + mediaSettings: MediaSettings.low()); await cameraController.initialize(); when(CameraPlatform.instance .unlockCaptureOrientation(cameraController.cameraId)) @@ -1394,11 +1408,8 @@ class MockCameraPlatform extends Mock Future>.value(mockAvailableCameras); @override - Future createCamera( - CameraDescription description, - ResolutionPreset? resolutionPreset, { - bool enableAudio = false, - }) => + Future createCameraWithSettings( + CameraDescription cameraDescription, MediaSettings? mediaSettings) => mockPlatformException ? throw PlatformException(code: 'foo', message: 'bar') : Future.value(mockInitializeCamera); diff --git a/packages/camera/camera_android/android/build.gradle b/packages/camera/camera_android/android/build.gradle index 476386ba6d2..68fbab41d89 100644 --- a/packages/camera/camera_android/android/build.gradle +++ b/packages/camera/camera_android/android/build.gradle @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.0.2' + classpath 'com.android.tools.build:gradle:7.2.0' } } 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 500407009c5..1a263221217 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 @@ -31,6 +31,7 @@ import android.os.HandlerThread; import android.os.Looper; import android.util.Log; +import android.util.Range; import android.util.Size; import android.view.Display; import android.view.Surface; @@ -54,6 +55,8 @@ 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.intfeature.IntFeature; import io.flutter.plugins.camera.features.resolution.ResolutionFeature; import io.flutter.plugins.camera.features.resolution.ResolutionPreset; import io.flutter.plugins.camera.features.sensororientation.DeviceOrientationManager; @@ -195,7 +198,10 @@ public Camera( final DartMessenger dartMessenger, final CameraProperties cameraProperties, final ResolutionPreset resolutionPreset, - final boolean enableAudio) { + final boolean enableAudio, + final Integer fps, + final Integer videoBitrate, + final Integer audioBitrate) { if (activity == null) { throw new IllegalStateException("No activity available!"); @@ -212,6 +218,22 @@ public Camera( CameraFeatures.init( cameraFeatureFactory, cameraProperties, activity, dartMessenger, resolutionPreset); + if (null != fps && 0 < fps.intValue()) { + final FpsRangeFeature fpsRange = new FpsRangeFeature(cameraProperties); + fpsRange.setValue(new Range<>(fps, fps)); + this.cameraFeatures.setFpsRange(fpsRange); + + this.cameraFeatures.setFps(new IntFeature(cameraProperties, fps)); + } + + if (null != videoBitrate && 0 < videoBitrate.intValue()) { + this.cameraFeatures.setVideoBitrate(new IntFeature(cameraProperties, videoBitrate)); + } + + if (null != audioBitrate && 0 < audioBitrate.intValue()) { + this.cameraFeatures.setAudioBitrate(new IntFeature(cameraProperties, audioBitrate)); + } + // Create capture callback. captureTimeouts = new CaptureTimeoutsWrapper(3000, 3000); captureProps = new CameraCaptureProperties(); @@ -259,9 +281,17 @@ private void prepareMediaRecorder(String outputFilePath) throws IOException { // once this has largely been fixed on the Android side. https://github.com/flutter/flutter/issues/119668 EncoderProfiles recordingProfile = getRecordingProfile(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && recordingProfile != null) { - mediaRecorderBuilder = new MediaRecorderBuilder(recordingProfile, outputFilePath); + mediaRecorderBuilder = + new MediaRecorderBuilder( + recordingProfile, outputFilePath, getFps(), getVideoBitrate(), getAudioBitrate()); } else { - mediaRecorderBuilder = new MediaRecorderBuilder(getRecordingProfileLegacy(), outputFilePath); + mediaRecorderBuilder = + new MediaRecorderBuilder( + getRecordingProfileLegacy(), + outputFilePath, + getFps(), + getVideoBitrate(), + getAudioBitrate()); } mediaRecorder = @@ -1017,6 +1047,18 @@ EncoderProfiles getRecordingProfile() { return cameraFeatures.getResolution().getRecordingProfile(); } + int getFps() { + return cameraFeatures.getFps().getValue(); + } + + int getVideoBitrate() { + return cameraFeatures.getVideoBitrate().getValue(); + } + + int getAudioBitrate() { + return cameraFeatures.getAudioBitrate().getValue(); + } + /** Shortut to get deviceOrientationListener. */ DeviceOrientationManager getDeviceOrientationManager() { return cameraFeatures.getSensorOrientation().getDeviceOrientationManager(); diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java index aad62bbaba8..e59cc1b621d 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java @@ -388,6 +388,9 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce String cameraName = call.argument("cameraName"); String preset = call.argument("resolutionPreset"); boolean enableAudio = call.argument("enableAudio"); + Integer fps = call.argument("fps"); + Integer videoBitrate = call.argument("videoBitrate"); + Integer audioBitrate = call.argument("audioBitrate"); TextureRegistry.SurfaceTextureEntry flutterSurfaceTexture = textureRegistry.createSurfaceTexture(); @@ -406,7 +409,10 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce dartMessenger, cameraProperties, resolutionPreset, - enableAudio); + enableAudio, + fps, + videoBitrate, + audioBitrate); Map reply = new HashMap<>(); reply.put("cameraId", flutterSurfaceTexture.id()); diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java index c7ed9bb205d..be89cb6b20e 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java @@ -14,6 +14,7 @@ import io.flutter.plugins.camera.features.flash.FlashFeature; import io.flutter.plugins.camera.features.focuspoint.FocusPointFeature; import io.flutter.plugins.camera.features.fpsrange.FpsRangeFeature; +import io.flutter.plugins.camera.features.intfeature.IntFeature; import io.flutter.plugins.camera.features.noisereduction.NoiseReductionFeature; import io.flutter.plugins.camera.features.resolution.ResolutionFeature; import io.flutter.plugins.camera.features.resolution.ResolutionPreset; @@ -40,6 +41,9 @@ public class CameraFeatures { private static final String RESOLUTION = "RESOLUTION"; private static final String SENSOR_ORIENTATION = "SENSOR_ORIENTATION"; private static final String ZOOM_LEVEL = "ZOOM_LEVEL"; + private static final String FPS = "FPS"; + private static final String VIDEO_BITRATE = "VIDEO_BITRATE"; + private static final String AUDIO_BITRATE = "AUDIO_BITRATE"; public static CameraFeatures init( CameraFeatureFactory cameraFeatureFactory, @@ -282,4 +286,28 @@ public ZoomLevelFeature getZoomLevel() { public void setZoomLevel(ZoomLevelFeature zoomLevel) { this.featureMap.put(ZOOM_LEVEL, zoomLevel); } + + public void setFps(IntFeature fps) { + this.featureMap.put(FPS, fps); + } + + public IntFeature getFps() { + return (IntFeature) featureMap.get(FPS); + } + + public void setVideoBitrate(IntFeature videoBitrate) { + this.featureMap.put(VIDEO_BITRATE, videoBitrate); + } + + public IntFeature getVideoBitrate() { + return (IntFeature) featureMap.get(VIDEO_BITRATE); + } + + public void setAudioBitrate(IntFeature audioBitrate) { + this.featureMap.put(AUDIO_BITRATE, audioBitrate); + } + + public IntFeature getAudioBitrate() { + return (IntFeature) featureMap.get(AUDIO_BITRATE); + } } diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/fpsrange/FpsRangeFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/fpsrange/FpsRangeFeature.java index 500f2aa28dc..4ff785551c6 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/fpsrange/FpsRangeFeature.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/fpsrange/FpsRangeFeature.java @@ -52,7 +52,8 @@ public FpsRangeFeature(CameraProperties cameraProperties) { } private boolean isPixel4A() { - return Build.BRAND.equals("google") && Build.MODEL.equals("Pixel 4a"); + //Build.BRAND or Build.MODEL can be null. + return "google".equals(Build.BRAND) && "Pixel 4a".equals(Build.MODEL); } @Override diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java new file mode 100644 index 00000000000..8701965af98 --- /dev/null +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java @@ -0,0 +1,43 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.camera.features.intfeature; + +import android.hardware.camera2.CaptureRequest; +import io.flutter.plugins.camera.CameraProperties; +import io.flutter.plugins.camera.features.CameraFeature; + +/** Controls the zoom configuration on the {@link android.hardware.camera2} API. */ +public class IntFeature extends CameraFeature { + + private Integer currentValue; + + public IntFeature(CameraProperties cameraProperties, Integer value) { + super(cameraProperties); + currentValue = value; + } + + @Override + public String getDebugName() { + return "IntFeature"; + } + + @Override + public Integer getValue() { + return currentValue; + } + + @Override + public void setValue(Integer value) { + currentValue = value; + } + + @Override + public boolean checkIsSupported() { + return true; + } + + @Override + public void updateBuilder(CaptureRequest.Builder requestBuilder) {} +} diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java index 1f9f6200bb9..aac276030a5 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java @@ -23,38 +23,73 @@ MediaRecorder makeMediaRecorder() { private final CamcorderProfile camcorderProfile; private final EncoderProfiles encoderProfiles; private final MediaRecorderFactory recorderFactory; + private final Integer fps; + private final Integer videoBitrate; + private final Integer audioBitrate; private boolean enableAudio; private int mediaOrientation; public MediaRecorderBuilder( - @NonNull CamcorderProfile camcorderProfile, @NonNull String outputFilePath) { - this(camcorderProfile, outputFilePath, new MediaRecorderFactory()); + @NonNull CamcorderProfile camcorderProfile, + @NonNull String outputFilePath, + Integer fps, + Integer videoBitrate, + Integer audioBitrate) { + this( + camcorderProfile, + outputFilePath, + new MediaRecorderFactory(), + fps, + videoBitrate, + audioBitrate); } public MediaRecorderBuilder( - @NonNull EncoderProfiles encoderProfiles, @NonNull String outputFilePath) { - this(encoderProfiles, outputFilePath, new MediaRecorderFactory()); + @NonNull EncoderProfiles encoderProfiles, + @NonNull String outputFilePath, + Integer fps, + Integer videoBitrate, + Integer audioBitrate) { + this( + encoderProfiles, + outputFilePath, + new MediaRecorderFactory(), + fps, + videoBitrate, + audioBitrate); } MediaRecorderBuilder( @NonNull CamcorderProfile camcorderProfile, @NonNull String outputFilePath, - MediaRecorderFactory helper) { + MediaRecorderFactory helper, + Integer fps, + Integer videoBitrate, + Integer audioBitrate) { this.outputFilePath = outputFilePath; this.camcorderProfile = camcorderProfile; this.encoderProfiles = null; this.recorderFactory = helper; + this.fps = fps; + this.videoBitrate = videoBitrate; + this.audioBitrate = audioBitrate; } MediaRecorderBuilder( @NonNull EncoderProfiles encoderProfiles, @NonNull String outputFilePath, - MediaRecorderFactory helper) { + MediaRecorderFactory helper, + Integer fps, + Integer videoBitrate, + Integer audioBitrate) { this.outputFilePath = outputFilePath; this.encoderProfiles = encoderProfiles; this.camcorderProfile = null; this.recorderFactory = helper; + this.fps = fps; + this.videoBitrate = videoBitrate; + this.audioBitrate = audioBitrate; } public MediaRecorderBuilder setEnableAudio(boolean enableAudio) { @@ -82,24 +117,33 @@ public MediaRecorder build() throws IOException, NullPointerException, IndexOutO mediaRecorder.setOutputFormat(encoderProfiles.getRecommendedFileFormat()); if (enableAudio) { mediaRecorder.setAudioEncoder(audioProfile.getCodec()); - mediaRecorder.setAudioEncodingBitRate(audioProfile.getBitrate()); + mediaRecorder.setAudioEncodingBitRate( + (null != audioBitrate && 0 < audioBitrate) ? audioBitrate : audioProfile.getBitrate()); mediaRecorder.setAudioSamplingRate(audioProfile.getSampleRate()); } mediaRecorder.setVideoEncoder(videoProfile.getCodec()); - mediaRecorder.setVideoEncodingBitRate(videoProfile.getBitrate()); - mediaRecorder.setVideoFrameRate(videoProfile.getFrameRate()); + mediaRecorder.setVideoEncodingBitRate( + (null != videoBitrate && 0 < videoBitrate) ? videoBitrate : videoProfile.getBitrate()); + mediaRecorder.setVideoFrameRate((null != fps && 0 < fps) ? fps : videoProfile.getFrameRate()); mediaRecorder.setVideoSize(videoProfile.getWidth(), videoProfile.getHeight()); mediaRecorder.setVideoSize(videoProfile.getWidth(), videoProfile.getHeight()); } else { mediaRecorder.setOutputFormat(camcorderProfile.fileFormat); if (enableAudio) { mediaRecorder.setAudioEncoder(camcorderProfile.audioCodec); - mediaRecorder.setAudioEncodingBitRate(camcorderProfile.audioBitRate); + mediaRecorder.setAudioEncodingBitRate( + (null != audioBitrate && 0 < audioBitrate) + ? audioBitrate + : camcorderProfile.audioBitRate); mediaRecorder.setAudioSamplingRate(camcorderProfile.audioSampleRate); } mediaRecorder.setVideoEncoder(camcorderProfile.videoCodec); - mediaRecorder.setVideoEncodingBitRate(camcorderProfile.videoBitRate); - mediaRecorder.setVideoFrameRate(camcorderProfile.videoFrameRate); + mediaRecorder.setVideoEncodingBitRate( + (null != videoBitrate && 0 < videoBitrate) + ? videoBitrate + : camcorderProfile.videoBitRate); + mediaRecorder.setVideoFrameRate( + (null != fps && 0 < fps) ? fps : camcorderProfile.videoFrameRate); mediaRecorder.setVideoSize( camcorderProfile.videoFrameWidth, camcorderProfile.videoFrameHeight); } 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 9de33e3dc7a..10f82aa865e 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 @@ -136,7 +136,10 @@ public void before() { mockDartMessenger, mockCameraProperties, resolutionPreset, - enableAudio); + enableAudio, + Integer.valueOf(15), + Integer.valueOf(200000), + Integer.valueOf(32000)); TestUtils.setPrivateField(camera, "captureSession", mockCaptureSession); TestUtils.setPrivateField(camera, "previewRequestBuilder", mockPreviewRequestBuilder); @@ -179,7 +182,10 @@ public void shouldCreateCameraPluginAndSetAllFeatures() { mockDartMessenger, mockCameraProperties, resolutionPreset, - enableAudio); + enableAudio, + Integer.valueOf(15), + Integer.valueOf(200000), + Integer.valueOf(32000)); verify(mockCameraFeatureFactory, times(1)) .createSensorOrientationFeature(mockCameraProperties, mockActivity, mockDartMessenger); diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest_getRecordingProfileTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest_getRecordingProfileTest.java index 04bab14f26a..45f535045c7 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest_getRecordingProfileTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest_getRecordingProfileTest.java @@ -73,7 +73,10 @@ public void before() { mockDartMessenger, mockCameraProperties, resolutionPreset, - enableAudio); + enableAudio, + Integer.valueOf(15), + Integer.valueOf(200000), + Integer.valueOf(32000)); } @Config(maxSdk = 30) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java index 6cc58ee823d..f53b10508f3 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java @@ -26,7 +26,8 @@ public class MediaRecorderBuilderTest { @Test public void ctor_testLegacy() { MediaRecorderBuilder builder = - new MediaRecorderBuilder(CamcorderProfile.get(CamcorderProfile.QUALITY_1080P), ""); + new MediaRecorderBuilder( + CamcorderProfile.get(CamcorderProfile.QUALITY_1080P), "", 15, 200000, 32000); assertNotNull(builder); } @@ -35,7 +36,29 @@ public void ctor_testLegacy() { @Test public void ctor_test() { MediaRecorderBuilder builder = - new MediaRecorderBuilder(CamcorderProfile.getAll("0", CamcorderProfile.QUALITY_1080P), ""); + new MediaRecorderBuilder( + CamcorderProfile.getAll("0", CamcorderProfile.QUALITY_1080P), "", 15, 200000, 32000); + + assertNotNull(builder); + } + + @Config(maxSdk = 30) + @SuppressWarnings("deprecation") + @Test + public void ctor_testDefaultsLegacy() { + MediaRecorderBuilder builder = + new MediaRecorderBuilder( + CamcorderProfile.get(CamcorderProfile.QUALITY_1080P), "", null, null, null); + + assertNotNull(builder); + } + + @Config(minSdk = 31) + @Test + public void ctor_testDefaults() { + MediaRecorderBuilder builder = + new MediaRecorderBuilder( + CamcorderProfile.getAll("0", CamcorderProfile.QUALITY_1080P), "", null, null, null); assertNotNull(builder); } @@ -51,7 +74,7 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabledLegacy() throw String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory) + new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, 15, 200000, 32000) .setEnableAudio(false) .setMediaOrientation(mediaOrientation); @@ -63,8 +86,8 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabledLegacy() throw inOrder.verify(recorder).setVideoSource(MediaRecorder.VideoSource.SURFACE); inOrder.verify(recorder).setOutputFormat(recorderProfile.fileFormat); inOrder.verify(recorder).setVideoEncoder(recorderProfile.videoCodec); - inOrder.verify(recorder).setVideoEncodingBitRate(recorderProfile.videoBitRate); - inOrder.verify(recorder).setVideoFrameRate(recorderProfile.videoFrameRate); + inOrder.verify(recorder).setVideoEncodingBitRate(200000); + inOrder.verify(recorder).setVideoFrameRate(15); inOrder .verify(recorder) .setVideoSize(recorderProfile.videoFrameWidth, recorderProfile.videoFrameHeight); @@ -87,7 +110,7 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabled() throws IOEx String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory) + new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, 15, 200000, 32000) .setEnableAudio(false) .setMediaOrientation(mediaOrientation); @@ -103,8 +126,8 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabled() throws IOEx inOrder.verify(recorder).setVideoSource(MediaRecorder.VideoSource.SURFACE); inOrder.verify(recorder).setOutputFormat(recorderProfile.getRecommendedFileFormat()); inOrder.verify(recorder).setVideoEncoder(videoProfile.getCodec()); - inOrder.verify(recorder).setVideoEncodingBitRate(videoProfile.getBitrate()); - inOrder.verify(recorder).setVideoFrameRate(videoProfile.getFrameRate()); + inOrder.verify(recorder).setVideoEncodingBitRate(200000); + inOrder.verify(recorder).setVideoFrameRate(15); inOrder.verify(recorder).setVideoSize(videoProfile.getWidth(), videoProfile.getHeight()); inOrder.verify(recorder).setOutputFile(outputFilePath); inOrder.verify(recorder).setOrientationHint(mediaOrientation); @@ -121,7 +144,7 @@ public void build_shouldThrowExceptionWithoutVideoOrAudioProfiles() throws IOExc String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory) + new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, 15, 200000, 32000) .setEnableAudio(false) .setMediaOrientation(mediaOrientation); @@ -141,7 +164,7 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabledLegacy() throws String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory) + new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, 15, 200000, 32000) .setEnableAudio(true) .setMediaOrientation(mediaOrientation); @@ -154,11 +177,11 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabledLegacy() throws inOrder.verify(recorder).setVideoSource(MediaRecorder.VideoSource.SURFACE); inOrder.verify(recorder).setOutputFormat(recorderProfile.fileFormat); inOrder.verify(recorder).setAudioEncoder(recorderProfile.audioCodec); - inOrder.verify(recorder).setAudioEncodingBitRate(recorderProfile.audioBitRate); + inOrder.verify(recorder).setAudioEncodingBitRate(32000); inOrder.verify(recorder).setAudioSamplingRate(recorderProfile.audioSampleRate); inOrder.verify(recorder).setVideoEncoder(recorderProfile.videoCodec); - inOrder.verify(recorder).setVideoEncodingBitRate(recorderProfile.videoBitRate); - inOrder.verify(recorder).setVideoFrameRate(recorderProfile.videoFrameRate); + inOrder.verify(recorder).setVideoEncodingBitRate(200000); + inOrder.verify(recorder).setVideoFrameRate(15); inOrder .verify(recorder) .setVideoSize(recorderProfile.videoFrameWidth, recorderProfile.videoFrameHeight); @@ -181,7 +204,7 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabled() throws IOExc String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory) + new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, 15, 200000, 32000) .setEnableAudio(true) .setMediaOrientation(mediaOrientation); @@ -199,11 +222,11 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabled() throws IOExc inOrder.verify(recorder).setVideoSource(MediaRecorder.VideoSource.SURFACE); inOrder.verify(recorder).setOutputFormat(recorderProfile.getRecommendedFileFormat()); inOrder.verify(recorder).setAudioEncoder(audioProfile.getCodec()); - inOrder.verify(recorder).setAudioEncodingBitRate(audioProfile.getBitrate()); + inOrder.verify(recorder).setAudioEncodingBitRate(32000); inOrder.verify(recorder).setAudioSamplingRate(audioProfile.getSampleRate()); inOrder.verify(recorder).setVideoEncoder(videoProfile.getCodec()); - inOrder.verify(recorder).setVideoEncodingBitRate(videoProfile.getBitrate()); - inOrder.verify(recorder).setVideoFrameRate(videoProfile.getFrameRate()); + inOrder.verify(recorder).setVideoEncodingBitRate(200000); + inOrder.verify(recorder).setVideoFrameRate(15); inOrder.verify(recorder).setVideoSize(videoProfile.getWidth(), videoProfile.getHeight()); inOrder.verify(recorder).setOutputFile(outputFilePath); inOrder.verify(recorder).setOrientationHint(mediaOrientation); diff --git a/packages/camera/camera_android/example/android/app/src/main/AndroidManifest.xml b/packages/camera/camera_android/example/android/app/src/main/AndroidManifest.xml index cef23162ddb..f2853039700 100644 --- a/packages/camera/camera_android/example/android/app/src/main/AndroidManifest.xml +++ b/packages/camera/camera_android/example/android/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ android:launchMode="singleTop" android:name="io.flutter.embedding.android.FlutterActivity" android:theme="@style/LaunchTheme" + android:exported="true" android:windowSoftInputMode="adjustResize"> diff --git a/packages/camera/camera_android/example/android/build.gradle b/packages/camera/camera_android/example/android/build.gradle index 807cc56b145..08a0f03d05f 100644 --- a/packages/camera/camera_android/example/android/build.gradle +++ b/packages/camera/camera_android/example/android/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.0.1' + classpath 'com.android.tools.build:gradle:7.2.0' } } diff --git a/packages/camera/camera_android/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/camera/camera_android/example/android/gradle/wrapper/gradle-wrapper.properties index 297f2fec363..3c472b99c6f 100644 --- a/packages/camera/camera_android/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/camera/camera_android/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/packages/camera/camera_android/example/android/settings.gradle b/packages/camera/camera_android/example/android/settings.gradle index 115da6cb4f4..5d487c90509 100644 --- a/packages/camera/camera_android/example/android/settings.gradle +++ b/packages/camera/camera_android/example/android/settings.gradle @@ -1,5 +1,15 @@ include ':app' +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" + def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() def plugins = new Properties() @@ -12,4 +22,4 @@ plugins.each { name, path -> def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() include ":$name" project(":$name").projectDir = pluginDirectory -} +} \ No newline at end of file diff --git a/packages/camera/camera_android/example/lib/camera_controller.dart b/packages/camera/camera_android/example/lib/camera_controller.dart index fd4f09a027b..f76b25350d4 100644 --- a/packages/camera/camera_android/example/lib/camera_controller.dart +++ b/packages/camera/camera_android/example/lib/camera_controller.dart @@ -223,10 +223,16 @@ class CameraController extends ValueNotifier { ); }); - _cameraId = await CameraPlatform.instance.createCamera( + _cameraId = await CameraPlatform.instance.createCameraWithSettings( description, - resolutionPreset, - enableAudio: enableAudio, + MediaSettings( + resolutionPreset: ResolutionPreset.high, + fps: 30, + videoBitrate: 600000, + audioBitrate: 32000, + enableAudio: enableAudio, + ), + ); CameraPlatform.instance diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index 79c7be12495..f95ec1bdeec 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -21,6 +21,16 @@ dependencies: quiver: ^3.0.0 video_player: ^2.1.4 + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + + camera_android: + path: ../../../camera/camera_android + camera_platform_interface: + path: ../../../camera/camera_platform_interface + dev_dependencies: build_runner: ^2.1.10 flutter_driver: diff --git a/packages/camera/camera_android/lib/src/android_camera.dart b/packages/camera/camera_android/lib/src/android_camera.dart index eca1003247c..a1d7847c15b 100644 --- a/packages/camera/camera_android/lib/src/android_camera.dart +++ b/packages/camera/camera_android/lib/src/android_camera.dart @@ -92,19 +92,20 @@ class AndroidCamera extends CameraPlatform { } @override - Future createCamera( + Future createCameraWithSettings( CameraDescription cameraDescription, - ResolutionPreset? resolutionPreset, { - bool enableAudio = false, - }) async { + MediaSettings? mediaSettings,) async { try { final Map? reply = await _channel .invokeMapMethod('create', { 'cameraName': cameraDescription.name, - 'resolutionPreset': resolutionPreset != null - ? _serializeResolutionPreset(resolutionPreset) + 'resolutionPreset': null != mediaSettings?.resolutionPreset + ? _serializeResolutionPreset(mediaSettings!.resolutionPreset!) : null, - 'enableAudio': enableAudio, + 'fps': mediaSettings?.fps, + 'videoBitrate': mediaSettings?.videoBitrate, + 'audioBitrate': mediaSettings?.audioBitrate, + 'enableAudio': mediaSettings?.enableAudio ?? true, }); return reply!['cameraId']! as int; diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index aff401efcde..88406111468 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -30,3 +30,8 @@ dev_dependencies: sdk: flutter flutter_test: sdk: flutter + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_android/test/android_camera_test.dart b/packages/camera/camera_android/test/android_camera_test.dart index b56aa4e352a..e43f5d5228b 100644 --- a/packages/camera/camera_android/test/android_camera_test.dart +++ b/packages/camera/camera_android/test/android_camera_test.dart @@ -58,12 +58,12 @@ void main() { final AndroidCamera camera = AndroidCamera(); // Act - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0), - ResolutionPreset.high, + MediaSettings.low(enableAudio: false), ); // Assert @@ -72,7 +72,10 @@ void main() { 'create', arguments: { 'cameraName': 'Test', - 'resolutionPreset': 'high', + 'resolutionPreset': 'low', + 'fps': 15, + 'videoBitrate': 200000, + 'audioBitrate': 32000, 'enableAudio': false }, ), @@ -93,13 +96,13 @@ void main() { // Act expect( - () => camera.createCamera( + () => camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ), throwsA( isA() @@ -124,13 +127,13 @@ void main() { // Act expect( - () => camera.createCamera( + () => camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ), throwsA( isA() @@ -186,13 +189,13 @@ void main() { 'initialize': null }); final AndroidCamera camera = AndroidCamera(); - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); // Act @@ -233,13 +236,13 @@ void main() { }); final AndroidCamera camera = AndroidCamera(); - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -281,13 +284,13 @@ void main() { }, ); camera = AndroidCamera(); - cameraId = await camera.createCamera( + cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -454,13 +457,13 @@ void main() { }, ); camera = AndroidCamera(); - cameraId = await camera.createCamera( + cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add( diff --git a/packages/camera/camera_android_camerax/android/build.gradle b/packages/camera/camera_android_camerax/android/build.gradle index 336e1600989..ae80cac54f7 100644 --- a/packages/camera/camera_android_camerax/android/build.gradle +++ b/packages/camera/camera_android_camerax/android/build.gradle @@ -8,7 +8,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' + classpath 'com.android.tools.build:gradle:7.2.0' } } diff --git a/packages/camera/camera_android_camerax/example/android/build.gradle b/packages/camera/camera_android_camerax/example/android/build.gradle index 7c909c6116c..5379add6835 100644 --- a/packages/camera/camera_android_camerax/example/android/build.gradle +++ b/packages/camera/camera_android_camerax/example/android/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.2.2' + classpath 'com.android.tools.build:gradle:7.2.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/packages/camera/camera_android_camerax/example/integration_test/integration_test.dart b/packages/camera/camera_android_camerax/example/integration_test/integration_test.dart index b6cba8da981..d1dd977fe35 100644 --- a/packages/camera/camera_android_camerax/example/integration_test/integration_test.dart +++ b/packages/camera/camera_android_camerax/example/integration_test/integration_test.dart @@ -39,8 +39,8 @@ void main() { return; } for (final CameraDescription cameraDescription in availableCameras) { - final CameraController controller = - CameraController(cameraDescription, ResolutionPreset.high); + final CameraController controller = CameraController(cameraDescription, + mediaSettings: MediaSettings.low()); await controller.initialize(); // Take Picture diff --git a/packages/camera/camera_android_camerax/example/lib/camera_controller.dart b/packages/camera/camera_android_camerax/example/lib/camera_controller.dart index b1b5e9d4ceb..723d6d788e9 100644 --- a/packages/camera/camera_android_camerax/example/lib/camera_controller.dart +++ b/packages/camera/camera_android_camerax/example/lib/camera_controller.dart @@ -225,25 +225,22 @@ class CameraValue { class CameraController extends ValueNotifier { /// Creates a new camera controller in an uninitialized state. CameraController( - this.description, - this.resolutionPreset, { - this.enableAudio = true, + this.description, { + this.mediaSettings, this.imageFormatGroup, }) : super(const CameraValue.uninitialized()); /// The properties of the camera device controlled by this controller. final CameraDescription description; - /// The resolution this controller is targeting. + /// The media settings this controller is targeting. /// - /// This resolution preset is not guaranteed to be available on the device, + /// This media settings are not guaranteed to be available on the device, /// if unavailable a lower resolution will be used. /// - /// See also: [ResolutionPreset]. - final ResolutionPreset resolutionPreset; + /// See also: [MediaSettings]. + final MediaSettings? mediaSettings; - /// Whether to include audio when recording a video. - final bool enableAudio; /// The [ImageFormatGroup] describes the output of the raw image format. /// @@ -293,10 +290,9 @@ class CameraController extends ValueNotifier { ); }); - _cameraId = await CameraPlatform.instance.createCamera( + _cameraId = await CameraPlatform.instance.createCameraWithSettings( description, - resolutionPreset, - enableAudio: enableAudio, + mediaSettings, ); _unawaited(CameraPlatform.instance diff --git a/packages/camera/camera_android_camerax/example/lib/main.dart b/packages/camera/camera_android_camerax/example/lib/main.dart index c668871b7a6..0e8bdf0d598 100644 --- a/packages/camera/camera_android_camerax/example/lib/main.dart +++ b/packages/camera/camera_android_camerax/example/lib/main.dart @@ -617,8 +617,7 @@ class _CameraExampleHomeState extends State final CameraController cameraController = CameraController( cameraDescription, - kIsWeb ? ResolutionPreset.max : ResolutionPreset.medium, - enableAudio: enableAudio, + mediaSettings: MediaSettings.low(enableAudio: enableAudio), imageFormatGroup: ImageFormatGroup.jpeg, ); diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index d3ca746e6c6..dbe0e6eb2ec 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -19,6 +19,16 @@ dependencies: sdk: flutter video_player: ^2.4.10 + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + + camera_android_camerax: + path: ../../../camera/camera_android_camerax + camera_platform_interface: + path: ../../../camera/camera_platform_interface + dev_dependencies: flutter_test: sdk: flutter 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 adafd74f33f..5219f51f3f1 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 @@ -123,13 +123,12 @@ class AndroidCameraCameraX extends CameraPlatform { /// that a camera preview can be drawn to, a [Preview] instance is configured /// and bound to the [ProcessCameraProvider] instance. @override - Future createCamera( + Future createCameraWithSettings( CameraDescription cameraDescription, - ResolutionPreset? resolutionPreset, { - bool enableAudio = false, - }) async { + MediaSettings? mediaSettings, + ) async { // Must obtain proper permissions before attempting to access a camera. - await requestCameraPermissions(enableAudio); + await requestCameraPermissions(mediaSettings?.enableAudio ?? true); // Save CameraSelector that matches cameraDescription. final int cameraSelectorLensDirection = @@ -146,12 +145,18 @@ class AndroidCameraCameraX extends CameraPlatform { processCameraProvider!.unbindAll(); // Configure Preview instance. - _resolutionPreset = resolutionPreset; + _resolutionPreset = mediaSettings?.resolutionPreset; + final int targetRotation = _getTargetRotation(cameraDescription.sensorOrientation); + final ResolutionInfo? previewTargetResolution = - _getTargetResolutionForPreview(resolutionPreset); + null != mediaSettings?.resolutionPreset + ? _getTargetResolutionForPreview(mediaSettings!.resolutionPreset) + : null; + preview = createPreview(targetRotation, previewTargetResolution); + final int flutterSurfaceTextureId = await preview!.setSurfaceProvider(); // Configure ImageCapture instance. diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 764b057f03d..c9d827e46f6 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -32,3 +32,8 @@ dev_dependencies: sdk: flutter mockito: 5.3.2 pigeon: ^9.1.0 + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {camera_platform_interface: {path: ../../camera/camera_platform_interface}} 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 640c1ed2d24..7310750ec7f 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 @@ -107,16 +107,15 @@ void main() { name: 'cameraName', lensDirection: testLensDirection, sensorOrientation: testSensorOrientation); - const ResolutionPreset testResolutionPreset = ResolutionPreset.veryHigh; - const bool enableAudio = true; + const int testSurfaceTextureId = 6; when(camera.testPreview.setSurfaceProvider()) .thenAnswer((_) async => testSurfaceTextureId); expect( - await camera.createCamera(testCameraDescription, testResolutionPreset, - enableAudio: enableAudio), + await camera.createCameraWithSettings(testCameraDescription, + MediaSettings.low()), equals(testSurfaceTextureId)); // Verify permissions are requested and the camera starts listening for device orientation changes. @@ -150,8 +149,13 @@ void main() { const ResolutionPreset testResolutionPreset = ResolutionPreset.veryHigh; const bool enableAudio = true; - await camera.createCamera(testCameraDescription, testResolutionPreset, - enableAudio: enableAudio); + await camera.createCameraWithSettings(testCameraDescription, + const MediaSettings( + resolutionPreset: testResolutionPreset, + fps: 15, + videoBitrate: 2000000, + audioBitrate: 64000,enableAudio: enableAudio, + )); verify(camera.processCameraProvider!.bindToLifecycle(camera.cameraSelector!, [camera.testPreview, camera.testImageCapture])); @@ -174,8 +178,6 @@ void main() { name: 'cameraName', lensDirection: testLensDirection, sensorOrientation: testSensorOrientation); - const ResolutionPreset testResolutionPreset = ResolutionPreset.veryHigh; - const bool enableAudio = true; const int resolutionWidth = 350; const int resolutionHeight = 750; final Camera mockCamera = MockCamera(); @@ -199,8 +201,8 @@ void main() { // Call createCamera. when(camera.testPreview.setSurfaceProvider()) .thenAnswer((_) async => cameraId); - await camera.createCamera(testCameraDescription, testResolutionPreset, - enableAudio: enableAudio); + await camera.createCameraWithSettings(testCameraDescription, + MediaSettings.low(), ); when(camera.processCameraProvider!.bindToLifecycle(camera.cameraSelector!, [camera.testPreview, camera.testImageCapture])) diff --git a/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart b/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart index 315a34e9f9b..fd71d5e7025 100644 --- a/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart +++ b/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart @@ -81,8 +81,15 @@ void main() { bool previousPresetExactlySupported = true; for (final MapEntry preset in presetExpectedSizes.entries) { - final CameraController controller = - CameraController(cameraDescription, preset.key); + final CameraController controller = CameraController.withSettings( + cameraDescription, + mediaSettings: MediaSettings( + resolutionPreset: preset.key, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), + ); await controller.initialize(); final bool presetExactlySupported = await testCaptureImageResolution(controller, preset.key); @@ -130,8 +137,15 @@ void main() { bool previousPresetExactlySupported = true; for (final MapEntry preset in presetExpectedSizes.entries) { - final CameraController controller = - CameraController(cameraDescription, preset.key); + final CameraController controller = CameraController.withSettings( + cameraDescription, + mediaSettings: MediaSettings( + resolutionPreset: preset.key, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), + ); await controller.initialize(); await controller.prepareForVideoRecording(); final bool presetExactlySupported = @@ -151,10 +165,10 @@ void main() { return; } - final CameraController controller = CameraController( + final CameraController controller = CameraController.withSettings( cameras[0], - ResolutionPreset.low, - enableAudio: false, + mediaSettings: MediaSettings.low(enableAudio: false), + ); await controller.initialize(); @@ -205,10 +219,9 @@ void main() { return; } - final CameraController controller = CameraController( + final CameraController controller = CameraController.withSettings( cameras[0], - ResolutionPreset.low, - enableAudio: false, + mediaSettings: MediaSettings.low(enableAudio: false), ); await controller.initialize(); @@ -227,10 +240,9 @@ void main() { return; } - final CameraController controller = CameraController( + final CameraController controller = CameraController.withSettings( cameras[0], - ResolutionPreset.low, - enableAudio: false, + mediaSettings: MediaSettings.low(enableAudio: false), ); await controller.initialize(); @@ -242,10 +254,9 @@ void main() { /// Start streaming with specifying the ImageFormatGroup. Future startStreaming(List cameras, ImageFormatGroup? imageFormatGroup) async { - final CameraController controller = CameraController( + final CameraController controller = CameraController.withSettings( cameras.first, - ResolutionPreset.low, - enableAudio: false, + mediaSettings: MediaSettings.low(enableAudio: false), imageFormatGroup: imageFormatGroup, ); @@ -298,10 +309,9 @@ void main() { return; } - final CameraController controller = CameraController( + final CameraController controller = CameraController.withSettings( cameras[0], - ResolutionPreset.low, - enableAudio: false, + mediaSettings: MediaSettings.low(enableAudio: false), ); await controller.initialize(); diff --git a/packages/camera/camera_avfoundation/example/ios/Runner.xcodeproj/project.pbxproj b/packages/camera/camera_avfoundation/example/ios/Runner.xcodeproj/project.pbxproj index a20638d18e1..7ce926c77d3 100644 --- a/packages/camera/camera_avfoundation/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/camera/camera_avfoundation/example/ios/Runner.xcodeproj/project.pbxproj @@ -290,7 +290,6 @@ }; 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; - DevelopmentTeam = W4ZTW5E78A; }; }; }; @@ -495,7 +494,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = RunnerTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "dev.flutter.plugins.cameraExample.camera-exampleTests"; @@ -521,7 +524,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = RunnerTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "dev.flutter.plugins.cameraExample.camera-exampleTests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -641,14 +648,17 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = W4ZTW5E78A; + DEVELOPMENT_TEAM = S984M7CLA3; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -663,14 +673,17 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = W4ZTW5E78A; + DEVELOPMENT_TEAM = S984M7CLA3; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", diff --git a/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraCaptureSessionQueueRaceConditionTests.m b/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraCaptureSessionQueueRaceConditionTests.m index 89f40307933..5c736a69524 100644 --- a/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraCaptureSessionQueueRaceConditionTests.m +++ b/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraCaptureSessionQueueRaceConditionTests.m @@ -20,9 +20,15 @@ - (void)testFixForCaptureSessionQueueNullPointerCrashDueToRaceCondition { [self expectationWithDescription:@"create's result block must be called"]; FlutterMethodCall *disposeCall = [FlutterMethodCall methodCallWithMethodName:@"dispose" arguments:nil]; - FlutterMethodCall *createCall = [FlutterMethodCall - methodCallWithMethodName:@"create" - arguments:@{@"resolutionPreset" : @"medium", @"enableAudio" : @(1)}]; + FlutterMethodCall *createCall = + [FlutterMethodCall methodCallWithMethodName:@"create" + arguments:@{ + @"resolutionPreset" : @"medium", + @"fps" : @(15), + @"videoBitrate" : @(200000), + @"audioBitrate" : @(32000), + @"enableAudio" : @(1) + }]; // Mimic a dispose call followed by a create call, which can be triggered by slightly dragging the // home bar, causing the app to be inactive, and immediately regain active. [camera handleMethodCall:disposeCall diff --git a/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraMethodChannelTests.m b/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraMethodChannelTests.m index bd20134db56..3a10b0728ee 100644 --- a/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraMethodChannelTests.m +++ b/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraMethodChannelTests.m @@ -32,9 +32,14 @@ - (void)testCreate_ShouldCallResultOnMainThread { [[MockFLTThreadSafeFlutterResult alloc] initWithExpectation:expectation]; // Set up method call - FlutterMethodCall *call = [FlutterMethodCall - methodCallWithMethodName:@"create" - arguments:@{@"resolutionPreset" : @"medium", @"enableAudio" : @(1)}]; + FlutterMethodCall *call = [FlutterMethodCall methodCallWithMethodName:@"create" + arguments:@{ + @"resolutionPreset" : @"medium", + @"fps" : @(15), + @"videoBitrate" : @(200000), + @"audioBitrate" : @(32000), + @"enableAudio" : @(1) + }]; [camera createCameraOnSessionQueueWithCreateMethodCall:call result:resultObject]; [self waitForExpectationsWithTimeout:1 handler:nil]; diff --git a/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraTestUtils.m b/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraTestUtils.m index b42aa34e2a1..c1da71307d1 100644 --- a/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraTestUtils.m +++ b/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraTestUtils.m @@ -21,6 +21,9 @@ return [[FLTCam alloc] initWithCameraName:@"camera" resolutionPreset:@"medium" + fps:@(15) + videoBitrate:@(200000) + audioBitrate:@(32000) enableAudio:true orientation:UIDeviceOrientationPortrait videoCaptureSession:videoSessionMock diff --git a/packages/camera/camera_avfoundation/example/lib/camera_controller.dart b/packages/camera/camera_avfoundation/example/lib/camera_controller.dart index 6e1804328d5..caeef958942 100644 --- a/packages/camera/camera_avfoundation/example/lib/camera_controller.dart +++ b/packages/camera/camera_avfoundation/example/lib/camera_controller.dart @@ -171,26 +171,27 @@ class CameraValue { /// outside of the overall example code. class CameraController extends ValueNotifier { /// Creates a new camera controller in an uninitialized state. + /// Deprecated, use [withSettings]. CameraController( - CameraDescription cameraDescription, - this.resolutionPreset, { - this.enableAudio = true, - this.imageFormatGroup, - }) : super(CameraValue.uninitialized(cameraDescription)); + CameraDescription cameraDescription, + ResolutionPreset resolutionPreset, { + bool enableAudio = true, + this.imageFormatGroup, + }) : _mediaSettings = MediaSettings( + resolutionPreset: resolutionPreset, enableAudio: enableAudio,), + super(CameraValue.uninitialized(cameraDescription)); + + /// Creates a new camera controller in an uninitialized state, using specified media settings like fps and bitrate. + CameraController.withSettings( + CameraDescription cameraDescription, { + MediaSettings? mediaSettings, + this.imageFormatGroup, } + ) : _mediaSettings = mediaSettings, super(CameraValue.uninitialized(cameraDescription)); /// The properties of the camera device controlled by this controller. CameraDescription get description => value.description; - /// The resolution this controller is targeting. - /// - /// This resolution preset is not guaranteed to be available on the device, - /// if unavailable a lower resolution will be used. - /// - /// See also: [ResolutionPreset]. - final ResolutionPreset resolutionPreset; - - /// Whether to include audio when recording a video. - final bool enableAudio; + final MediaSettings? _mediaSettings; /// The [ImageFormatGroup] describes the output of the raw image format. /// @@ -223,10 +224,8 @@ class CameraController extends ValueNotifier { ); }); - _cameraId = await CameraPlatform.instance.createCamera( - description, - resolutionPreset, - enableAudio: enableAudio, + _cameraId = await CameraPlatform.instance.createCameraWithSettings( + description, _mediaSettings, ); CameraPlatform.instance diff --git a/packages/camera/camera_avfoundation/example/lib/main.dart b/packages/camera/camera_avfoundation/example/lib/main.dart index dd02be3d7ae..91fecbf8c33 100644 --- a/packages/camera/camera_avfoundation/example/lib/main.dart +++ b/packages/camera/camera_avfoundation/example/lib/main.dart @@ -603,7 +603,10 @@ class _CameraExampleHomeState extends State title: Icon(getCameraLensIcon(cameraDescription.lensDirection)), groupValue: controller?.description, value: cameraDescription, - onChanged: onChanged, + onChanged: + controller != null && controller!.value.isRecordingVideo + ? null + : onChanged, ), ), ); @@ -645,10 +648,9 @@ class _CameraExampleHomeState extends State Future _initializeCameraController( CameraDescription cameraDescription) async { - final CameraController cameraController = CameraController( + final CameraController cameraController = CameraController.withSettings( cameraDescription, - kIsWeb ? ResolutionPreset.max : ResolutionPreset.medium, - enableAudio: enableAudio, + mediaSettings: MediaSettings.low(enableAudio: enableAudio), imageFormatGroup: ImageFormatGroup.jpeg, ); diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index 3879cff7558..ed7b402666b 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -21,6 +21,17 @@ dependencies: quiver: ^3.0.0 video_player: ^2.1.4 + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + + + camera_avfoundation: + path: ../../../camera/camera_avfoundation + camera_platform_interface: + path: ../../../camera/camera_platform_interface + dev_dependencies: build_runner: ^2.1.10 flutter_driver: diff --git a/packages/camera/camera_avfoundation/ios/Classes/CameraPlugin.m b/packages/camera/camera_avfoundation/ios/Classes/CameraPlugin.m index 874f37b6c4f..2d1082c65e6 100644 --- a/packages/camera/camera_avfoundation/ios/Classes/CameraPlugin.m +++ b/packages/camera/camera_avfoundation/ios/Classes/CameraPlugin.m @@ -303,11 +303,17 @@ - (void)createCameraOnSessionQueueWithCreateMethodCall:(FlutterMethodCall *)crea if (!strongSelf) return; NSString *cameraName = createMethodCall.arguments[@"cameraName"]; + NSNumber *fps = createMethodCall.arguments[@"fps"]; + NSNumber *videoBitrate = createMethodCall.arguments[@"videoBitrate"]; + NSNumber *audioBitrate = createMethodCall.arguments[@"audioBitrate"]; NSString *resolutionPreset = createMethodCall.arguments[@"resolutionPreset"]; NSNumber *enableAudio = createMethodCall.arguments[@"enableAudio"]; NSError *error; FLTCam *cam = [[FLTCam alloc] initWithCameraName:cameraName resolutionPreset:resolutionPreset + fps:fps + videoBitrate:videoBitrate + audioBitrate:audioBitrate enableAudio:[enableAudio boolValue] orientation:[[UIDevice currentDevice] orientation] captureSessionQueue:strongSelf.captureSessionQueue diff --git a/packages/camera/camera_avfoundation/ios/Classes/FLTCam.h b/packages/camera/camera_avfoundation/ios/Classes/FLTCam.h index fbf4ef4882c..4fcefb3d2d5 100644 --- a/packages/camera/camera_avfoundation/ios/Classes/FLTCam.h +++ b/packages/camera/camera_avfoundation/ios/Classes/FLTCam.h @@ -40,6 +40,9 @@ NS_ASSUME_NONNULL_BEGIN /// @param error report to the caller if any error happened creating the camera. - (instancetype)initWithCameraName:(NSString *)cameraName resolutionPreset:(NSString *)resolutionPreset + fps:(NSNumber *)fps + videoBitrate:(NSNumber *)videoBitrate + audioBitrate:(NSNumber *)audioBitrate enableAudio:(BOOL)enableAudio orientation:(UIDeviceOrientation)orientation captureSessionQueue:(dispatch_queue_t)captureSessionQueue diff --git a/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m b/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m index 31bffc91794..4dbbe3e6bb1 100644 --- a/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m +++ b/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m @@ -41,6 +41,9 @@ @interface FLTCam () @property(readonly, nonatomic) int64_t textureId; +@property NSNumber *fps; +@property NSNumber *videoBitrate; +@property NSNumber *audioBitrate; @property BOOL enableAudio; @property(nonatomic) FLTImageStreamHandler *imageStreamHandler; @property(readonly, nonatomic) AVCaptureSession *videoCaptureSession; @@ -94,12 +97,18 @@ @implementation FLTCam - (instancetype)initWithCameraName:(NSString *)cameraName resolutionPreset:(NSString *)resolutionPreset + fps:(NSNumber *)fps + videoBitrate:(NSNumber *)videoBitrate + audioBitrate:(NSNumber *)audioBitrate enableAudio:(BOOL)enableAudio orientation:(UIDeviceOrientation)orientation captureSessionQueue:(dispatch_queue_t)captureSessionQueue error:(NSError **)error { return [self initWithCameraName:cameraName resolutionPreset:resolutionPreset + fps:fps + videoBitrate:videoBitrate + audioBitrate:audioBitrate enableAudio:enableAudio orientation:orientation videoCaptureSession:[[AVCaptureSession alloc] init] @@ -110,6 +119,9 @@ - (instancetype)initWithCameraName:(NSString *)cameraName - (instancetype)initWithCameraName:(NSString *)cameraName resolutionPreset:(NSString *)resolutionPreset + fps:(NSNumber *)fps + videoBitrate:(NSNumber *)videoBitrate + audioBitrate:(NSNumber *)audioBitrate enableAudio:(BOOL)enableAudio orientation:(UIDeviceOrientation)orientation videoCaptureSession:(AVCaptureSession *)videoCaptureSession @@ -123,6 +135,9 @@ - (instancetype)initWithCameraName:(NSString *)cameraName } @catch (NSError *e) { *error = e; } + _fps = fps; + _videoBitrate = videoBitrate; + _audioBitrate = audioBitrate; _enableAudio = enableAudio; _captureSessionQueue = captureSessionQueue; _pixelBufferSynchronizationQueue = @@ -191,6 +206,16 @@ - (AVCaptureConnection *)createConnection:(NSError **)error { connection.videoMirrored = YES; } + if (_fps) { + [_videoCaptureSession beginConfiguration]; + NSError *outError; + [_captureDevice lockForConfiguration:&outError]; + _captureDevice.activeVideoMinFrameDuration = CMTimeMake(1, [_fps intValue]); + _captureDevice.activeVideoMaxFrameDuration = CMTimeMake(1, [_fps intValue]); + [_videoCaptureSession commitConfiguration]; + [_captureDevice unlockForConfiguration]; + } + return connection; } @@ -1101,8 +1126,23 @@ - (BOOL)setupWriterForPath:(NSString *)path { return NO; } - NSDictionary *videoSettings = [_captureVideoOutput - recommendedVideoSettingsForAssetWriterWithOutputFileType:AVFileTypeMPEG4]; + NSMutableDictionary *videoSettings = [[_captureVideoOutput + recommendedVideoSettingsForAssetWriterWithOutputFileType:AVFileTypeMPEG4] mutableCopy]; + + if (_videoBitrate || _fps) { + NSMutableDictionary *compressionProperties = [@{} mutableCopy]; + + if (_videoBitrate) { + compressionProperties[AVVideoAverageBitRateKey] = _videoBitrate; + } + + if (_videoBitrate) { + compressionProperties[AVVideoExpectedSourceFrameRateKey] = _fps; + } + + videoSettings[AVVideoCompressionPropertiesKey] = compressionProperties; + } + _videoWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings]; @@ -1121,14 +1161,18 @@ - (BOOL)setupWriterForPath:(NSString *)path { AudioChannelLayout acl; bzero(&acl, sizeof(acl)); acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono; - NSDictionary *audioOutputSettings = nil; - // Both type of audio inputs causes output video file to be corrupted. - audioOutputSettings = @{ + NSMutableDictionary *audioOutputSettings = [@{ AVFormatIDKey : [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVSampleRateKey : [NSNumber numberWithFloat:44100.0], AVNumberOfChannelsKey : [NSNumber numberWithInt:1], AVChannelLayoutKey : [NSData dataWithBytes:&acl length:sizeof(acl)], - }; + } mutableCopy]; + + if (_audioBitrate) { + // Both type of audio inputs causes output video file to be corrupted. + audioOutputSettings[AVEncoderBitRateKey] = _audioBitrate; + } + _audioWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioOutputSettings]; _audioWriterInput.expectsMediaDataInRealTime = YES; diff --git a/packages/camera/camera_avfoundation/ios/Classes/FLTCam_Test.h b/packages/camera/camera_avfoundation/ios/Classes/FLTCam_Test.h index acc64846cb2..bf39a84dc93 100644 --- a/packages/camera/camera_avfoundation/ios/Classes/FLTCam_Test.h +++ b/packages/camera/camera_avfoundation/ios/Classes/FLTCam_Test.h @@ -48,6 +48,9 @@ /// Allows for injecting dependencies that are usually internal. - (instancetype)initWithCameraName:(NSString *)cameraName resolutionPreset:(NSString *)resolutionPreset + fps:(NSNumber *)fps + videoBitrate:(NSNumber *)videoBitrate + audioBitrate:(NSNumber *)audioBitrate enableAudio:(BOOL)enableAudio orientation:(UIDeviceOrientation)orientation videoCaptureSession:(AVCaptureSession *)videoCaptureSession diff --git a/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart b/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart index 33f550b3211..f1c6469b799 100644 --- a/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart +++ b/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart @@ -92,19 +92,21 @@ class AVFoundationCamera extends CameraPlatform { } @override - Future createCamera( + Future createCameraWithSettings( CameraDescription cameraDescription, - ResolutionPreset? resolutionPreset, { - bool enableAudio = false, - }) async { + MediaSettings? mediaSettings, + ) async { try { final Map? reply = await _channel .invokeMapMethod('create', { 'cameraName': cameraDescription.name, - 'resolutionPreset': resolutionPreset != null - ? _serializeResolutionPreset(resolutionPreset) + 'resolutionPreset': null != mediaSettings?.resolutionPreset + ? _serializeResolutionPreset(mediaSettings!.resolutionPreset!) : null, - 'enableAudio': enableAudio, + 'fps': mediaSettings?.fps, + 'videoBitrate': mediaSettings?.videoBitrate, + 'audioBitrate': mediaSettings?.audioBitrate, + 'enableAudio': mediaSettings?.enableAudio ?? true, }); return reply!['cameraId']! as int; diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index 55751196011..64b5d9ae557 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -28,3 +28,8 @@ dev_dependencies: sdk: flutter flutter_test: sdk: flutter + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart b/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart index e756f38ff12..707681ce769 100644 --- a/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart +++ b/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart @@ -58,12 +58,12 @@ void main() { final AVFoundationCamera camera = AVFoundationCamera(); // Act - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0), - ResolutionPreset.high, + MediaSettings.low(enableAudio: false), ); // Assert @@ -72,7 +72,10 @@ void main() { 'create', arguments: { 'cameraName': 'Test', - 'resolutionPreset': 'high', + 'resolutionPreset': 'low', + 'fps': 15, + 'videoBitrate': 200000, + 'audioBitrate': 32000, 'enableAudio': false }, ), @@ -93,13 +96,13 @@ void main() { // Act expect( - () => camera.createCamera( + () => camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ), throwsA( isA() @@ -124,13 +127,13 @@ void main() { // Act expect( - () => camera.createCamera( + () => camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ), throwsA( isA() @@ -186,13 +189,13 @@ void main() { 'initialize': null }); final AVFoundationCamera camera = AVFoundationCamera(); - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); // Act @@ -233,13 +236,13 @@ void main() { }); final AVFoundationCamera camera = AVFoundationCamera(); - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -281,13 +284,13 @@ void main() { }, ); camera = AVFoundationCamera(); - cameraId = await camera.createCamera( + cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -454,13 +457,13 @@ void main() { }, ); camera = AVFoundationCamera(); - cameraId = await camera.createCamera( + cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add( diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index 3741d8d4bfe..e0736cac6a0 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,7 +1,3 @@ -## 2.5.1 - -* CameraPlatform.createCameraWithSettings method for tune fps and bitrate of recorded video. - ## 2.5.0 * Adds NV21 as an image stream format (suitable for Android). diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart index 45f56b12338..a6ade5ecd9e 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -18,11 +18,12 @@ class MediaSettings { }); /// Default low quality factory - static MediaSettings low() => const MediaSettings( + static MediaSettings low({bool enableAudio = true}) => MediaSettings( resolutionPreset: ResolutionPreset.low, fps: 15, videoBitrate: 200000, audioBitrate: 32000, + enableAudio: enableAudio, ); /// resolution preset diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 93b10fca061..7c3da2d4fc8 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.5.1 +version: 2.5.0 environment: sdk: ">=2.17.0 <4.0.0" diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index 34db7a1033e..2c6a21ca8de 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -38,7 +38,7 @@ void main() { name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0), - MediaSettings.low(), + MediaSettings.low(enableAudio: false), ); // Assert diff --git a/packages/camera/camera_web/example/integration_test/camera_options_test.dart b/packages/camera/camera_web/example/integration_test/camera_options_test.dart index 6619ff41e03..2389b386380 100644 --- a/packages/camera/camera_web/example/integration_test/camera_options_test.dart +++ b/packages/camera/camera_web/example/integration_test/camera_options_test.dart @@ -60,8 +60,11 @@ void main() { group('AudioConstraints', () { testWidgets('serializes correctly', (WidgetTester tester) async { expect( - const AudioConstraints(enabled: true).toJson(), - equals(true), + const AudioConstraints(enabled: true, bitrate: 28000).toJson(), + equals({ + 'enabled': true, + 'bitrate': 28000, + }), ); }); @@ -80,6 +83,7 @@ void main() { width: const VideoSizeConstraint(ideal: 100, maximum: 100), height: const VideoSizeConstraint(ideal: 50, maximum: 50), deviceId: 'deviceId', + bitrate: 250000, ); expect( @@ -88,6 +92,7 @@ void main() { 'facingMode': videoConstraints.facingMode!.toJson(), 'width': videoConstraints.width!.toJson(), 'height': videoConstraints.height!.toJson(), + 'bitrate': videoConstraints.bitrate!, 'deviceId': { 'exact': 'deviceId', } diff --git a/packages/camera/camera_web/example/integration_test/camera_web_test.dart b/packages/camera/camera_web/example/integration_test/camera_web_test.dart index 820a84be720..2acf798ee12 100644 --- a/packages/camera/camera_web/example/integration_test/camera_web_test.dart +++ b/packages/camera/camera_web/example/integration_test/camera_web_test.dart @@ -540,10 +540,12 @@ void main() { .mapResolutionPresetToSize(ResolutionPreset.ultraHigh), ).thenReturn(ultraHighResolutionSize); - final int cameraId = await CameraPlatform.instance.createCamera( + final int cameraId = await CameraPlatform.instance.createCameraWithSettings( cameraDescription, - ResolutionPreset.ultraHigh, - enableAudio: true, + const MediaSettings( + resolutionPreset: ResolutionPreset.ultraHigh, + enableAudio: true, + ), ); expect( @@ -582,9 +584,11 @@ void main() { () => cameraService.mapResolutionPresetToSize(ResolutionPreset.max), ).thenReturn(maxResolutionSize); - final int cameraId = await CameraPlatform.instance.createCamera( + final int cameraId = await CameraPlatform.instance.createCameraWithSettings( cameraDescription, - null, + const MediaSettings( + resolutionPreset: ResolutionPreset.max, + ), ); expect( @@ -616,13 +620,13 @@ void main() { 'if there is no metadata ' 'for the given camera description', (WidgetTester tester) async { expect( - () => CameraPlatform.instance.createCamera( + () => CameraPlatform.instance.createCameraWithSettings( const CameraDescription( name: 'name', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.ultraHigh, + MediaSettings.low(), ), throwsA( isA().having( diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index 222ba25cf5a..fe1507a7f8f 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -9,11 +9,20 @@ dependencies: flutter: sdk: flutter + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + + camera_platform_interface: + path: ../../../camera/camera_platform_interface + camera_web: + path: ../../../camera/camera_web + dev_dependencies: async: ^2.5.0 - camera_platform_interface: ^2.1.0 + camera_platform_interface: camera_web: - path: ../ cross_file: ^0.3.1 flutter_driver: sdk: flutter diff --git a/packages/camera/camera_web/lib/src/camera.dart b/packages/camera/camera_web/lib/src/camera.dart index 13ef21b1ea4..b9440bc0991 100644 --- a/packages/camera/camera_web/lib/src/camera.dart +++ b/packages/camera/camera_web/lib/src/camera.dart @@ -448,6 +448,10 @@ class Camera { mediaRecorder ??= html.MediaRecorder(videoElement.srcObject!, { 'mimeType': _videoMimeType, + if (null != options.audio.bitrate) + 'audioBitsPerSecond': options.audio.bitrate!, + if (null != options.video.bitrate) + 'videoBitsPerSecond': options.video.bitrate!, }); _videoAvailableCompleter = Completer(); @@ -609,6 +613,7 @@ class Camera { /// any of the available video mime types. String get _videoMimeType { const List types = [ + 'video/webm;codecs="vp9,opus"', 'video/mp4', 'video/webm', ]; diff --git a/packages/camera/camera_web/lib/src/camera_service.dart b/packages/camera/camera_web/lib/src/camera_service.dart index 451278c23fc..8533eb71d68 100644 --- a/packages/camera/camera_web/lib/src/camera_service.dart +++ b/packages/camera/camera_web/lib/src/camera_service.dart @@ -310,6 +310,40 @@ class CameraService { return const Size(320, 240); } + /// Maps the given [resolutionPreset] to video bitrate. + int mapResolutionPresetToVideoBitrate(ResolutionPreset resolutionPreset) { + switch (resolutionPreset) { + case ResolutionPreset.max: + case ResolutionPreset.ultraHigh: + return 8000000; + case ResolutionPreset.veryHigh: + return 4000000; + case ResolutionPreset.high: + return 1000000; + case ResolutionPreset.medium: + return 400000; + case ResolutionPreset.low: + return 200000; + } + } + + /// Maps the given [resolutionPreset] to audio bitrate. + int mapResolutionPresetToAudioBitrate(ResolutionPreset resolutionPreset) { + switch (resolutionPreset) { + case ResolutionPreset.max: + case ResolutionPreset.ultraHigh: + return 128000; + case ResolutionPreset.veryHigh: + return 128000; + case ResolutionPreset.high: + return 64000; + case ResolutionPreset.medium: + return 48000; + case ResolutionPreset.low: + return 320000; + } + } + /// Maps the given [deviceOrientation] to [OrientationType]. String mapDeviceOrientationToOrientationType( DeviceOrientation deviceOrientation, diff --git a/packages/camera/camera_web/lib/src/camera_web.dart b/packages/camera/camera_web/lib/src/camera_web.dart index 52fdc1c3f8d..2b1788a612d 100644 --- a/packages/camera/camera_web/lib/src/camera_web.dart +++ b/packages/camera/camera_web/lib/src/camera_web.dart @@ -197,11 +197,10 @@ class CameraPlugin extends CameraPlatform { } @override - Future createCamera( + Future createCameraWithSettings( CameraDescription cameraDescription, - ResolutionPreset? resolutionPreset, { - bool enableAudio = false, - }) async { + MediaSettings? mediaSettings, + ) async { try { if (!camerasMetadata.containsKey(cameraDescription)) { throw PlatformException( @@ -221,8 +220,8 @@ class CameraPlugin extends CameraPlatform { // Use the highest resolution possible // if the resolution preset is not specified. - final Size videoSize = _cameraService - .mapResolutionPresetToSize(resolutionPreset ?? ResolutionPreset.max); + final Size videoSize = _cameraService.mapResolutionPresetToSize( + mediaSettings?.resolutionPreset ?? ResolutionPreset.max); // Create a camera with the given audio and video constraints. // Sensor orientation is currently not supported. @@ -230,8 +229,10 @@ class CameraPlugin extends CameraPlatform { textureId: textureId, cameraService: _cameraService, options: CameraOptions( - audio: AudioConstraints(enabled: enableAudio), + audio: AudioConstraints( + enabled: mediaSettings?.enableAudio ?? true, bitrate: mediaSettings?.audioBitrate), video: VideoConstraints( + bitrate: mediaSettings?.videoBitrate, facingMode: cameraType != null ? FacingModeConstraint(cameraType) : null, width: VideoSizeConstraint( diff --git a/packages/camera/camera_web/lib/src/types/camera_options.dart b/packages/camera/camera_web/lib/src/types/camera_options.dart index 08491b56081..affc399e25d 100644 --- a/packages/camera/camera_web/lib/src/types/camera_options.dart +++ b/packages/camera/camera_web/lib/src/types/camera_options.dart @@ -58,25 +58,28 @@ class CameraOptions { class AudioConstraints { /// Creates a new instance of [AudioConstraints] /// with the given [enabled] constraint. - const AudioConstraints({this.enabled = false}); + const AudioConstraints({this.bitrate, this.enabled = false}); /// Whether the audio track should be enabled. final bool enabled; + /// Audio bitrate + final int? bitrate; + /// Converts the current instance to a Map. - Object toJson() => enabled; + Map toJson() => + {'enabled': enabled, 'bitrate': bitrate}; @override - bool operator ==(Object other) { - if (identical(this, other)) { - return true; - } - - return other is AudioConstraints && other.enabled == enabled; - } + bool operator ==(Object other) => + identical(this, other) || + other is AudioConstraints && + runtimeType == other.runtimeType && + enabled == other.enabled && + bitrate == other.bitrate; @override - int get hashCode => enabled.hashCode; + int get hashCode => enabled.hashCode ^ bitrate.hashCode; } /// Defines constraints that the video track must have @@ -86,12 +89,16 @@ class VideoConstraints { /// Creates a new instance of [VideoConstraints] /// with the given constraints. const VideoConstraints({ + this.bitrate, this.facingMode, this.width, this.height, this.deviceId, }); + /// Video bitrate + final int? bitrate; + /// The facing mode of the video track. final FacingModeConstraint? facingMode; @@ -121,24 +128,29 @@ class VideoConstraints { json['deviceId'] = {'exact': deviceId!}; } + json['bitrate'] = bitrate; + return json; } @override - bool operator ==(Object other) { - if (identical(this, other)) { - return true; - } - - return other is VideoConstraints && - other.facingMode == facingMode && - other.width == width && - other.height == height && - other.deviceId == deviceId; - } + bool operator ==(Object other) => + identical(this, other) || + other is VideoConstraints && + runtimeType == other.runtimeType && + bitrate == other.bitrate && + facingMode == other.facingMode && + width == other.width && + height == other.height && + deviceId == other.deviceId; @override - int get hashCode => Object.hash(facingMode, width, height, deviceId); + int get hashCode => + bitrate.hashCode ^ + facingMode.hashCode ^ + width.hashCode ^ + height.hashCode ^ + deviceId.hashCode; } /// The camera type used in [FacingModeConstraint]. diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 9d6739d7ccb..d9f9ab5251b 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -27,3 +27,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_windows/example/lib/main.dart b/packages/camera/camera_windows/example/lib/main.dart index e6d903c774b..d6b6c055a61 100644 --- a/packages/camera/camera_windows/example/lib/main.dart +++ b/packages/camera/camera_windows/example/lib/main.dart @@ -29,10 +29,9 @@ class _MyAppState extends State { bool _initialized = false; bool _recording = false; bool _recordingTimed = false; - bool _recordAudio = true; bool _previewPaused = false; Size? _previewSize; - ResolutionPreset _resolutionPreset = ResolutionPreset.veryHigh; + MediaSettings _mediaSettings = MediaSettings.low(); StreamSubscription? _errorStreamSubscription; StreamSubscription? _cameraClosingStreamSubscription; @@ -93,10 +92,9 @@ class _MyAppState extends State { final int cameraIndex = _cameraIndex % _cameras.length; final CameraDescription camera = _cameras[cameraIndex]; - cameraId = await CameraPlatform.instance.createCamera( + cameraId = await CameraPlatform.instance.createCameraWithSettings( camera, - _resolutionPreset, - enableAudio: _recordAudio, + _mediaSettings, ); _errorStreamSubscription?.cancel(); @@ -276,7 +274,13 @@ class _MyAppState extends State { Future _onResolutionChange(ResolutionPreset newValue) async { setState(() { - _resolutionPreset = newValue; + _mediaSettings = MediaSettings( + resolutionPreset: newValue, + fps: _mediaSettings.fps, + videoBitrate: _mediaSettings.videoBitrate, + audioBitrate: _mediaSettings.audioBitrate, + enableAudio: _mediaSettings.enableAudio, + ); }); if (_initialized && _cameraId >= 0) { // Re-inits camera with new resolution preset. @@ -287,7 +291,13 @@ class _MyAppState extends State { Future _onAudioChange(bool recordAudio) async { setState(() { - _recordAudio = recordAudio; + _mediaSettings = MediaSettings( + resolutionPreset: _mediaSettings.resolutionPreset, + fps: _mediaSettings.fps, + videoBitrate: _mediaSettings.videoBitrate, + audioBitrate: _mediaSettings.audioBitrate, + enableAudio: recordAudio, + ); }); if (_initialized && _cameraId >= 0) { // Re-inits camera with new record audio setting. @@ -359,7 +369,7 @@ class _MyAppState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ DropdownButton( - value: _resolutionPreset, + value: _mediaSettings.resolutionPreset, onChanged: (ResolutionPreset? value) { if (value != null) { _onResolutionChange(value); @@ -370,7 +380,7 @@ class _MyAppState extends State { const SizedBox(width: 20), const Text('Audio:'), Switch( - value: _recordAudio, + value: _mediaSettings.enableAudio, onChanged: (bool state) => _onAudioChange(state)), const SizedBox(width: 20), ElevatedButton( diff --git a/packages/camera/camera_windows/example/pubspec.yaml b/packages/camera/camera_windows/example/pubspec.yaml index 5dc3a68a381..19e6d13ce95 100644 --- a/packages/camera/camera_windows/example/pubspec.yaml +++ b/packages/camera/camera_windows/example/pubspec.yaml @@ -18,6 +18,16 @@ dependencies: flutter: sdk: flutter + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + + camera_platform_interface: + path: ../../../camera/camera_platform_interface + camera_windows: + path: ../../../camera/camera_windows + dev_dependencies: async: ^2.5.0 flutter_test: diff --git a/packages/camera/camera_windows/lib/camera_windows.dart b/packages/camera/camera_windows/lib/camera_windows.dart index 4b0c1586f43..f0882240f7a 100644 --- a/packages/camera/camera_windows/lib/camera_windows.dart +++ b/packages/camera/camera_windows/lib/camera_windows.dart @@ -64,18 +64,22 @@ class CameraWindows extends CameraPlatform { } @override - Future createCamera( + Future createCameraWithSettings( CameraDescription cameraDescription, - ResolutionPreset? resolutionPreset, { - bool enableAudio = false, - }) async { + MediaSettings? mediaSettings, + ) async { try { // If resolutionPreset is not specified, plugin selects the highest resolution possible. final Map? reply = await pluginChannel .invokeMapMethod('create', { 'cameraName': cameraDescription.name, - 'resolutionPreset': _serializeResolutionPreset(resolutionPreset), - 'enableAudio': enableAudio, + 'resolutionPreset': null != mediaSettings?.resolutionPreset + ? _serializeResolutionPreset(mediaSettings!.resolutionPreset) + : null, + 'fps': mediaSettings?.fps, + 'videoBitrate': mediaSettings?.videoBitrate, + 'audioBitrate': mediaSettings?.audioBitrate, + 'enableAudio': mediaSettings?.enableAudio ?? true, }); if (reply == null) { diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index 0786ad22fea..afbe32d8f5e 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -27,3 +27,8 @@ dev_dependencies: async: ^2.5.0 flutter_test: sdk: flutter + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_windows/test/camera_windows_test.dart b/packages/camera/camera_windows/test/camera_windows_test.dart index 8d7b5d3d718..cd9c8d6e334 100644 --- a/packages/camera/camera_windows/test/camera_windows_test.dart +++ b/packages/camera/camera_windows/test/camera_windows_test.dart @@ -8,6 +8,7 @@ import 'package:camera_windows/camera_windows.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; + import './utils/method_channel_mock.dart'; void main() { @@ -34,12 +35,12 @@ void main() { final CameraWindows plugin = CameraWindows(); // Act - final int cameraId = await plugin.createCamera( + final int cameraId = await plugin.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.front, sensorOrientation: 0), - ResolutionPreset.high, + MediaSettings.low(enableAudio: false), ); // Assert @@ -48,7 +49,10 @@ void main() { 'create', arguments: { 'cameraName': 'Test', - 'resolutionPreset': 'high', + 'resolutionPreset': 'low', + 'fps': 15, + 'videoBitrate': 200000, + 'audioBitrate': 32000, 'enableAudio': false }, ), @@ -72,13 +76,13 @@ void main() { // Act expect( - () => plugin.createCamera( + () => plugin.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ), throwsA( isA() @@ -137,13 +141,13 @@ void main() { }, }); final CameraWindows plugin = CameraWindows(); - final int cameraId = await plugin.createCamera( + final int cameraId = await plugin.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); // Act @@ -174,13 +178,13 @@ void main() { }); final CameraWindows plugin = CameraWindows(); - final int cameraId = await plugin.createCamera( + final int cameraId = await plugin.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); await plugin.initializeCamera(cameraId); @@ -216,13 +220,13 @@ void main() { ); plugin = CameraWindows(); - cameraId = await plugin.createCamera( + cameraId = await plugin.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); await plugin.initializeCamera(cameraId); }); @@ -295,13 +299,13 @@ void main() { }, ); plugin = CameraWindows(); - cameraId = await plugin.createCamera( + cameraId = await plugin.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); await plugin.initializeCamera(cameraId); }); diff --git a/packages/camera/camera_windows/windows/camera.cpp b/packages/camera/camera_windows/windows/camera.cpp index 6a094474790..fb280490668 100644 --- a/packages/camera/camera_windows/windows/camera.cpp +++ b/packages/camera/camera_windows/windows/camera.cpp @@ -50,24 +50,28 @@ CameraImpl::~CameraImpl() { bool CameraImpl::InitCamera(flutter::TextureRegistrar* texture_registrar, flutter::BinaryMessenger* messenger, bool record_audio, - ResolutionPreset resolution_preset) { + ResolutionPreset resolution_preset, int fps, + int video_bitrate, int audio_bitrate) { auto capture_controller_factory = std::make_unique(); return InitCamera(std::move(capture_controller_factory), texture_registrar, - messenger, record_audio, resolution_preset); + messenger, record_audio, resolution_preset, fps, + video_bitrate, audio_bitrate); } bool CameraImpl::InitCamera( std::unique_ptr capture_controller_factory, flutter::TextureRegistrar* texture_registrar, flutter::BinaryMessenger* messenger, bool record_audio, - ResolutionPreset resolution_preset) { + ResolutionPreset resolution_preset, int fps, int video_bitrate, + int audio_bitrate) { assert(!device_id_.empty()); messenger_ = messenger; capture_controller_ = capture_controller_factory->CreateCaptureController(this); return capture_controller_->InitCaptureDevice( - texture_registrar, device_id_, record_audio, resolution_preset); + texture_registrar, device_id_, record_audio, resolution_preset, fps, + video_bitrate, audio_bitrate); } bool CameraImpl::AddPendingResult( diff --git a/packages/camera/camera_windows/windows/camera.h b/packages/camera/camera_windows/windows/camera.h index 8508da1924d..7a10442879a 100644 --- a/packages/camera/camera_windows/windows/camera.h +++ b/packages/camera/camera_windows/windows/camera.h @@ -67,8 +67,8 @@ class Camera : public CaptureControllerListener { // Returns false if initialization fails. virtual bool InitCamera(flutter::TextureRegistrar* texture_registrar, flutter::BinaryMessenger* messenger, - bool record_audio, - ResolutionPreset resolution_preset) = 0; + bool record_audio, ResolutionPreset resolution_preset, + int fps, int video_bitrate, int audio_bitrate) = 0; }; // Concrete implementation of the |Camera| interface. @@ -128,7 +128,8 @@ class CameraImpl : public Camera { } bool InitCamera(flutter::TextureRegistrar* texture_registrar, flutter::BinaryMessenger* messenger, bool record_audio, - ResolutionPreset resolution_preset) override; + ResolutionPreset resolution_preset, int fps, + int video_bitrate, int audio_bitrate) override; // Initializes the camera and its associated capture controller. // @@ -140,7 +141,8 @@ class CameraImpl : public Camera { std::unique_ptr capture_controller_factory, flutter::TextureRegistrar* texture_registrar, flutter::BinaryMessenger* messenger, bool record_audio, - ResolutionPreset resolution_preset); + ResolutionPreset resolution_preset, int fps, int video_bitrate, + int audio_bitrate); private: // Loops through all pending results and calls their error handler with given diff --git a/packages/camera/camera_windows/windows/camera_plugin.cpp b/packages/camera/camera_windows/windows/camera_plugin.cpp index 5503d17e702..6db615013d5 100644 --- a/packages/camera/camera_windows/windows/camera_plugin.cpp +++ b/packages/camera/camera_windows/windows/camera_plugin.cpp @@ -44,6 +44,9 @@ constexpr char kDisposeMethod[] = "dispose"; constexpr char kCameraNameKey[] = "cameraName"; constexpr char kResolutionPresetKey[] = "resolutionPreset"; +constexpr char kFpsKey[] = "fps"; +constexpr char kVideoBitrateKey[] = "videoBitrate"; +constexpr char kAudioBitrateKey[] = "audioBitrate"; constexpr char kEnableAudioKey[] = "enableAudio"; constexpr char kCameraIdKey[] = "cameraId"; @@ -398,8 +401,20 @@ void CameraPlugin::CreateMethodHandler( resolution_preset = ResolutionPreset::kAuto; } + const auto* fps_argument = std::get_if(ValueOrNull(args, kFpsKey)); + int fps = fps_argument ? *fps_argument : -1; + + const auto* video_bitrate_argument = + std::get_if(ValueOrNull(args, kVideoBitrateKey)); + int video_bitrate = video_bitrate_argument ? *video_bitrate_argument : -1; + + const auto* audio_bitrate_argument = + std::get_if(ValueOrNull(args, kAudioBitrateKey)); + int audio_bitrate = audio_bitrate_argument ? *audio_bitrate_argument : -1; + bool initialized = camera->InitCamera(texture_registrar_, messenger_, - *record_audio, resolution_preset); + *record_audio, resolution_preset, fps, + video_bitrate, audio_bitrate); if (initialized) { cameras_.push_back(std::move(camera)); } diff --git a/packages/camera/camera_windows/windows/capture_controller.cpp b/packages/camera/camera_windows/windows/capture_controller.cpp index 384c86ac109..d5ce550f458 100644 --- a/packages/camera/camera_windows/windows/capture_controller.cpp +++ b/packages/camera/camera_windows/windows/capture_controller.cpp @@ -301,7 +301,8 @@ void CaptureControllerImpl::ResetCaptureController() { bool CaptureControllerImpl::InitCaptureDevice( flutter::TextureRegistrar* texture_registrar, const std::string& device_id, - bool record_audio, ResolutionPreset resolution_preset) { + bool record_audio, ResolutionPreset resolution_preset, int fps, + int video_bitrate, int audio_bitrate) { assert(capture_controller_listener_); if (IsInitialized()) { @@ -316,6 +317,9 @@ bool CaptureControllerImpl::InitCaptureDevice( capture_engine_state_ = CaptureEngineState::kInitializing; resolution_preset_ = resolution_preset; + fps_ = fps; + video_bitrate_ = video_bitrate; + audio_bitrate_ = audio_bitrate; record_audio_ = record_audio; texture_registrar_ = texture_registrar; video_device_id_ = device_id; @@ -518,7 +522,8 @@ void CaptureControllerImpl::StartRecord(const std::string& file_path, } if (!record_handler_) { - record_handler_ = std::make_unique(record_audio_); + record_handler_ = std::make_unique( + record_audio_, fps_, video_bitrate_, audio_bitrate_); } else if (!record_handler_->CanStart()) { return OnRecordStarted( CameraResult::kError, diff --git a/packages/camera/camera_windows/windows/capture_controller.h b/packages/camera/camera_windows/windows/capture_controller.h index 9536be70c50..72be5c5d6fa 100644 --- a/packages/camera/camera_windows/windows/capture_controller.h +++ b/packages/camera/camera_windows/windows/capture_controller.h @@ -88,7 +88,8 @@ class CaptureController { virtual bool InitCaptureDevice(TextureRegistrar* texture_registrar, const std::string& device_id, bool record_audio, - ResolutionPreset resolution_preset) = 0; + ResolutionPreset resolution_preset, int fps, + int video_bitrate, int audio_bitrate) = 0; // Returns preview frame width virtual uint32_t GetPreviewWidth() const = 0; @@ -137,7 +138,8 @@ class CaptureControllerImpl : public CaptureController, // CaptureController bool InitCaptureDevice(TextureRegistrar* texture_registrar, const std::string& device_id, bool record_audio, - ResolutionPreset resolution_preset) override; + ResolutionPreset resolution_preset, int fps, + int video_bitrate, int audio_bitrate) override; uint32_t GetPreviewWidth() const override { return preview_frame_width_; } uint32_t GetPreviewHeight() const override { return preview_frame_height_; } void StartPreview() override; @@ -246,6 +248,9 @@ class CaptureControllerImpl : public CaptureController, CaptureEngineState capture_engine_state_ = CaptureEngineState::kNotInitialized; ResolutionPreset resolution_preset_ = ResolutionPreset::kMedium; + int fps_ = -1; + int video_bitrate_ = -1; + int audio_bitrate_ = -1; ComPtr capture_engine_; ComPtr capture_engine_callback_handler_; ComPtr dxgi_device_manager_; diff --git a/packages/camera/camera_windows/windows/record_handler.cpp b/packages/camera/camera_windows/windows/record_handler.cpp index 0f7192533fd..8a4654f51e6 100644 --- a/packages/camera/camera_windows/windows/record_handler.cpp +++ b/packages/camera/camera_windows/windows/record_handler.cpp @@ -114,6 +114,22 @@ HRESULT BuildMediaTypeForAudioCapture(IMFMediaType** audio_record_media_type) { return hr; } +// Helper function to set the frame rate on a video media type. +inline HRESULT SetFrameRate(IMFMediaType* pType, UINT32 numerator, + UINT32 denominator) { + return MFSetAttributeRatio(pType, MF_MT_FRAME_RATE, numerator, denominator); +} + +// Helper function to set the video bitrate on a video media type. +inline HRESULT SetVideoBitrate(IMFMediaType* pType, UINT32 bitrate) { + return pType->SetUINT32(MF_MT_AVG_BITRATE, bitrate); +} + +// Helper function to set the audio bitrate on an audio media type. +inline HRESULT SetAudioBitrate(IMFMediaType* pType, UINT32 bitrate) { + return pType->SetUINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, bitrate); +} + HRESULT RecordHandler::InitRecordSink(IMFCaptureEngine* capture_engine, IMFMediaType* base_media_type) { assert(!file_path_.empty()); @@ -160,6 +176,14 @@ HRESULT RecordHandler::InitRecordSink(IMFCaptureEngine* capture_engine, return hr; } + if (0 < fps_) { + SetFrameRate(video_record_media_type.Get(), fps_, 1); + } + + if (0 < video_bitrate_) { + SetVideoBitrate(video_record_media_type.Get(), video_bitrate_); + } + DWORD video_record_sink_stream_index; hr = record_sink_->AddStream( (DWORD)MF_CAPTURE_ENGINE_PREFERRED_SOURCE_STREAM_FOR_VIDEO_RECORD, @@ -175,6 +199,10 @@ HRESULT RecordHandler::InitRecordSink(IMFCaptureEngine* capture_engine, BuildMediaTypeForAudioCapture(audio_record_media_type.GetAddressOf()); if (SUCCEEDED(audio_capture_hr)) { + if (0 < audio_bitrate_) { + SetAudioBitrate(audio_record_media_type.Get(), audio_bitrate_); + } + DWORD audio_record_sink_stream_index; hr = record_sink_->AddStream( (DWORD)MF_CAPTURE_ENGINE_PREFERRED_SOURCE_STREAM_FOR_AUDIO, diff --git a/packages/camera/camera_windows/windows/record_handler.h b/packages/camera/camera_windows/windows/record_handler.h index 0c87bf9cec6..3e89a53b1bb 100644 --- a/packages/camera/camera_windows/windows/record_handler.h +++ b/packages/camera/camera_windows/windows/record_handler.h @@ -35,7 +35,12 @@ enum class RecordState { kNotStarted, kStarting, kRunning, kStopping }; // Handles record sink initialization and manages the state of video recording. class RecordHandler { public: - RecordHandler(bool record_audio) : record_audio_(record_audio) {} + RecordHandler(bool record_audio, int fps, int video_bitrate, + int audio_bitrate) + : record_audio_(record_audio), + fps_(fps), + video_bitrate_(video_bitrate), + audio_bitrate_(audio_bitrate) {} virtual ~RecordHandler() = default; // Prevent copying. @@ -104,6 +109,9 @@ class RecordHandler { IMFMediaType* base_media_type); bool record_audio_ = false; + int fps_ = -1; + int video_bitrate_ = -1; + int audio_bitrate_ = -1; int64_t max_video_duration_ms_ = -1; int64_t recording_start_timestamp_us_ = -1; uint64_t recording_duration_us_ = 0; diff --git a/packages/camera/camera_windows/windows/test/camera_plugin_test.cpp b/packages/camera/camera_windows/windows/test/camera_plugin_test.cpp index 9cab069bbb9..1c2687c4bc4 100644 --- a/packages/camera/camera_windows/windows/test/camera_plugin_test.cpp +++ b/packages/camera/camera_windows/windows/test/camera_plugin_test.cpp @@ -53,7 +53,8 @@ void MockInitCamera(MockCamera* camera, bool success) { .WillOnce([camera, success](flutter::TextureRegistrar* texture_registrar, flutter::BinaryMessenger* messenger, bool record_audio, - ResolutionPreset resolution_preset) { + ResolutionPreset resolution_preset, int fps, + int video_bitrate, int audio_bitrate) { assert(camera->pending_result_); if (success) { camera->pending_result_->Success(EncodableValue(1)); diff --git a/packages/camera/camera_windows/windows/test/camera_test.cpp b/packages/camera/camera_windows/windows/test/camera_test.cpp index 158a2c26c02..97cbbb48063 100644 --- a/packages/camera/camera_windows/windows/test/camera_test.cpp +++ b/packages/camera/camera_windows/windows/test/camera_test.cpp @@ -53,7 +53,7 @@ TEST(Camera, InitCameraCreatesCaptureController) { camera->InitCamera(std::move(capture_controller_factory), std::make_unique().get(), std::make_unique().get(), false, - ResolutionPreset::kAuto); + ResolutionPreset::kAuto, 5, 200000, 32000); EXPECT_TRUE(result); EXPECT_TRUE(camera->GetCaptureController() != nullptr); } @@ -84,7 +84,7 @@ TEST(Camera, InitCameraReportsFailure) { camera->InitCamera(std::move(capture_controller_factory), std::make_unique().get(), std::make_unique().get(), false, - ResolutionPreset::kAuto); + ResolutionPreset::kAuto, 5, 200000, 32000); EXPECT_FALSE(result); EXPECT_TRUE(camera->GetCaptureController() != nullptr); } @@ -490,7 +490,8 @@ TEST(Camera, OnVideoRecordSucceededInvokesCameraChannelEvent) { // Init camera with mock capture controller factory camera->InitCamera(std::move(capture_controller_factory), std::make_unique().get(), - binary_messenger.get(), false, ResolutionPreset::kAuto); + binary_messenger.get(), false, ResolutionPreset::kAuto, 5, + 200000, 32000); // Pass camera id for camera camera->OnCreateCaptureEngineSucceeded(camera_id); diff --git a/packages/camera/camera_windows/windows/test/capture_controller_test.cpp b/packages/camera/camera_windows/windows/test/capture_controller_test.cpp index 8d6632cbc3f..4613eca24b2 100644 --- a/packages/camera/camera_windows/windows/test/capture_controller_test.cpp +++ b/packages/camera/camera_windows/windows/test/capture_controller_test.cpp @@ -60,7 +60,8 @@ void MockInitCaptureController(CaptureControllerImpl* capture_controller, EXPECT_CALL(*engine, Initialize).Times(1); bool result = capture_controller->InitCaptureDevice( - texture_registrar, MOCK_DEVICE_ID, true, ResolutionPreset::kAuto); + texture_registrar, MOCK_DEVICE_ID, true, ResolutionPreset::kAuto, 5, + 200000, 32000); EXPECT_TRUE(result); @@ -258,7 +259,8 @@ TEST(CaptureController, InitCaptureEngineCanOnlyBeCalledOnce) { EXPECT_CALL(*camera, OnCreateCaptureEngineFailed).Times(1); bool result = capture_controller->InitCaptureDevice( - texture_registrar.get(), MOCK_DEVICE_ID, true, ResolutionPreset::kAuto); + texture_registrar.get(), MOCK_DEVICE_ID, true, ResolutionPreset::kAuto, 5, + 200000, 32000); EXPECT_FALSE(result); @@ -299,7 +301,8 @@ TEST(CaptureController, InitCaptureEngineReportsFailure) { .Times(1); bool result = capture_controller->InitCaptureDevice( - texture_registrar.get(), MOCK_DEVICE_ID, true, ResolutionPreset::kAuto); + texture_registrar.get(), MOCK_DEVICE_ID, true, ResolutionPreset::kAuto, 5, + 200000, 32000); EXPECT_FALSE(result); EXPECT_FALSE(engine->initialized_); @@ -343,7 +346,8 @@ TEST(CaptureController, InitCaptureEngineReportsAccessDenied) { .Times(1); bool result = capture_controller->InitCaptureDevice( - texture_registrar.get(), MOCK_DEVICE_ID, true, ResolutionPreset::kAuto); + texture_registrar.get(), MOCK_DEVICE_ID, true, ResolutionPreset::kAuto, 5, + 200000, 32000); EXPECT_FALSE(result); EXPECT_FALSE(engine->initialized_); diff --git a/packages/camera/camera_windows/windows/test/mocks.h b/packages/camera/camera_windows/windows/test/mocks.h index b6416eb7c71..f83b6680b44 100644 --- a/packages/camera/camera_windows/windows/test/mocks.h +++ b/packages/camera/camera_windows/windows/test/mocks.h @@ -206,7 +206,8 @@ class MockCamera : public Camera { MOCK_METHOD(bool, InitCamera, (flutter::TextureRegistrar * texture_registrar, flutter::BinaryMessenger* messenger, bool record_audio, - ResolutionPreset resolution_preset), + ResolutionPreset resolution_preset, int fps, int video_bitrate, + int audio_bitrate), (override)); std::unique_ptr capture_controller_; @@ -236,7 +237,8 @@ class MockCaptureController : public CaptureController { MOCK_METHOD(bool, InitCaptureDevice, (flutter::TextureRegistrar * texture_registrar, const std::string& device_id, bool record_audio, - ResolutionPreset resolution_preset), + ResolutionPreset resolution_preset, int fps, int video_bitrate, + int audio_bitrate), (override)); MOCK_METHOD(uint32_t, GetPreviewWidth, (), (const override)); From 59d66d300b3766f3849efcc2a9d25e9d94f7348b Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Thu, 30 Mar 2023 01:29:16 +0300 Subject: [PATCH 004/108] excerpts added. formatted. --- packages/camera/camera/README.md | 2 +- .../example/lib/camera_controller.dart | 1 - .../lib/src/android_camera.dart | 3 ++- .../test/android_camera_test.dart | 4 +-- .../example/lib/camera_controller.dart | 1 - .../test/android_camera_camerax_test.dart | 16 +++++++----- .../example/integration_test/camera_test.dart | 1 - .../example/lib/camera_controller.dart | 26 +++++++++++-------- .../test/avfoundation_camera_test.dart | 4 +-- .../integration_test/camera_web_test.dart | 6 +++-- .../camera/camera_web/lib/src/camera_web.dart | 3 ++- 11 files changed, 38 insertions(+), 29 deletions(-) diff --git a/packages/camera/camera/README.md b/packages/camera/camera/README.md index 4e43c3f56de..f2ed9fbb937 100644 --- a/packages/camera/camera/README.md +++ b/packages/camera/camera/README.md @@ -127,7 +127,7 @@ class _CameraAppState extends State { @override void initState() { super.initState(); - controller = CameraController( + controller = CameraController.withSettings( _cameras[0], mediaSettings: MediaSettings.low(), ); diff --git a/packages/camera/camera_android/example/lib/camera_controller.dart b/packages/camera/camera_android/example/lib/camera_controller.dart index f76b25350d4..7efeba994b8 100644 --- a/packages/camera/camera_android/example/lib/camera_controller.dart +++ b/packages/camera/camera_android/example/lib/camera_controller.dart @@ -232,7 +232,6 @@ class CameraController extends ValueNotifier { audioBitrate: 32000, enableAudio: enableAudio, ), - ); CameraPlatform.instance diff --git a/packages/camera/camera_android/lib/src/android_camera.dart b/packages/camera/camera_android/lib/src/android_camera.dart index a1d7847c15b..41658c222e9 100644 --- a/packages/camera/camera_android/lib/src/android_camera.dart +++ b/packages/camera/camera_android/lib/src/android_camera.dart @@ -94,7 +94,8 @@ class AndroidCamera extends CameraPlatform { @override Future createCameraWithSettings( CameraDescription cameraDescription, - MediaSettings? mediaSettings,) async { + MediaSettings? mediaSettings, + ) async { try { final Map? reply = await _channel .invokeMapMethod('create', { diff --git a/packages/camera/camera_android/test/android_camera_test.dart b/packages/camera/camera_android/test/android_camera_test.dart index e43f5d5228b..160389f65c0 100644 --- a/packages/camera/camera_android/test/android_camera_test.dart +++ b/packages/camera/camera_android/test/android_camera_test.dart @@ -102,7 +102,7 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + MediaSettings.low(), ), throwsA( isA() @@ -463,7 +463,7 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add( diff --git a/packages/camera/camera_android_camerax/example/lib/camera_controller.dart b/packages/camera/camera_android_camerax/example/lib/camera_controller.dart index 723d6d788e9..0de11636957 100644 --- a/packages/camera/camera_android_camerax/example/lib/camera_controller.dart +++ b/packages/camera/camera_android_camerax/example/lib/camera_controller.dart @@ -241,7 +241,6 @@ class CameraController extends ValueNotifier { /// See also: [MediaSettings]. final MediaSettings? mediaSettings; - /// The [ImageFormatGroup] describes the output of the raw image format. /// /// When null the imageFormat will fallback to the platforms default. 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 7310750ec7f..3f805c719fe 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 @@ -114,8 +114,8 @@ void main() { .thenAnswer((_) async => testSurfaceTextureId); expect( - await camera.createCameraWithSettings(testCameraDescription, - MediaSettings.low()), + await camera.createCameraWithSettings( + testCameraDescription, MediaSettings.low()), equals(testSurfaceTextureId)); // Verify permissions are requested and the camera starts listening for device orientation changes. @@ -149,12 +149,14 @@ void main() { const ResolutionPreset testResolutionPreset = ResolutionPreset.veryHigh; const bool enableAudio = true; - await camera.createCameraWithSettings(testCameraDescription, + await camera.createCameraWithSettings( + testCameraDescription, const MediaSettings( resolutionPreset: testResolutionPreset, fps: 15, videoBitrate: 2000000, - audioBitrate: 64000,enableAudio: enableAudio, + audioBitrate: 64000, + enableAudio: enableAudio, )); verify(camera.processCameraProvider!.bindToLifecycle(camera.cameraSelector!, @@ -201,8 +203,10 @@ void main() { // Call createCamera. when(camera.testPreview.setSurfaceProvider()) .thenAnswer((_) async => cameraId); - await camera.createCameraWithSettings(testCameraDescription, - MediaSettings.low(), ); + await camera.createCameraWithSettings( + testCameraDescription, + MediaSettings.low(), + ); when(camera.processCameraProvider!.bindToLifecycle(camera.cameraSelector!, [camera.testPreview, camera.testImageCapture])) diff --git a/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart b/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart index fd71d5e7025..36d872fbe77 100644 --- a/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart +++ b/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart @@ -168,7 +168,6 @@ void main() { final CameraController controller = CameraController.withSettings( cameras[0], mediaSettings: MediaSettings.low(enableAudio: false), - ); await controller.initialize(); diff --git a/packages/camera/camera_avfoundation/example/lib/camera_controller.dart b/packages/camera/camera_avfoundation/example/lib/camera_controller.dart index caeef958942..a68a8f2f721 100644 --- a/packages/camera/camera_avfoundation/example/lib/camera_controller.dart +++ b/packages/camera/camera_avfoundation/example/lib/camera_controller.dart @@ -173,20 +173,23 @@ class CameraController extends ValueNotifier { /// Creates a new camera controller in an uninitialized state. /// Deprecated, use [withSettings]. CameraController( - CameraDescription cameraDescription, - ResolutionPreset resolutionPreset, { - bool enableAudio = true, - this.imageFormatGroup, - }) : _mediaSettings = MediaSettings( - resolutionPreset: resolutionPreset, enableAudio: enableAudio,), + CameraDescription cameraDescription, + ResolutionPreset resolutionPreset, { + bool enableAudio = true, + this.imageFormatGroup, + }) : _mediaSettings = MediaSettings( + resolutionPreset: resolutionPreset, + enableAudio: enableAudio, + ), super(CameraValue.uninitialized(cameraDescription)); /// Creates a new camera controller in an uninitialized state, using specified media settings like fps and bitrate. CameraController.withSettings( - CameraDescription cameraDescription, { - MediaSettings? mediaSettings, - this.imageFormatGroup, } - ) : _mediaSettings = mediaSettings, super(CameraValue.uninitialized(cameraDescription)); + CameraDescription cameraDescription, { + MediaSettings? mediaSettings, + this.imageFormatGroup, + }) : _mediaSettings = mediaSettings, + super(CameraValue.uninitialized(cameraDescription)); /// The properties of the camera device controlled by this controller. CameraDescription get description => value.description; @@ -225,7 +228,8 @@ class CameraController extends ValueNotifier { }); _cameraId = await CameraPlatform.instance.createCameraWithSettings( - description, _mediaSettings, + description, + _mediaSettings, ); CameraPlatform.instance diff --git a/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart b/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart index 707681ce769..c5b186830cc 100644 --- a/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart +++ b/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart @@ -242,7 +242,7 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -290,7 +290,7 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( diff --git a/packages/camera/camera_web/example/integration_test/camera_web_test.dart b/packages/camera/camera_web/example/integration_test/camera_web_test.dart index 2acf798ee12..b5a839362fd 100644 --- a/packages/camera/camera_web/example/integration_test/camera_web_test.dart +++ b/packages/camera/camera_web/example/integration_test/camera_web_test.dart @@ -540,7 +540,8 @@ void main() { .mapResolutionPresetToSize(ResolutionPreset.ultraHigh), ).thenReturn(ultraHighResolutionSize); - final int cameraId = await CameraPlatform.instance.createCameraWithSettings( + final int cameraId = + await CameraPlatform.instance.createCameraWithSettings( cameraDescription, const MediaSettings( resolutionPreset: ResolutionPreset.ultraHigh, @@ -584,7 +585,8 @@ void main() { () => cameraService.mapResolutionPresetToSize(ResolutionPreset.max), ).thenReturn(maxResolutionSize); - final int cameraId = await CameraPlatform.instance.createCameraWithSettings( + final int cameraId = + await CameraPlatform.instance.createCameraWithSettings( cameraDescription, const MediaSettings( resolutionPreset: ResolutionPreset.max, diff --git a/packages/camera/camera_web/lib/src/camera_web.dart b/packages/camera/camera_web/lib/src/camera_web.dart index 2b1788a612d..a0656986ca8 100644 --- a/packages/camera/camera_web/lib/src/camera_web.dart +++ b/packages/camera/camera_web/lib/src/camera_web.dart @@ -230,7 +230,8 @@ class CameraPlugin extends CameraPlatform { cameraService: _cameraService, options: CameraOptions( audio: AudioConstraints( - enabled: mediaSettings?.enableAudio ?? true, bitrate: mediaSettings?.audioBitrate), + enabled: mediaSettings?.enableAudio ?? true, + bitrate: mediaSettings?.audioBitrate), video: VideoConstraints( bitrate: mediaSettings?.videoBitrate, facingMode: From aeec92ed52ff874542b879269ea7cd4b7b1cfc81 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Thu, 30 Mar 2023 01:43:28 +0300 Subject: [PATCH 005/108] versions and changelogs --- packages/camera/camera/CHANGELOG.md | 3 ++- packages/camera/camera/pubspec.yaml | 2 +- packages/camera/camera_android/CHANGELOG.md | 4 ++++ packages/camera/camera_android/pubspec.yaml | 2 +- packages/camera/camera_avfoundation/CHANGELOG.md | 4 ++++ packages/camera/camera_avfoundation/pubspec.yaml | 2 +- packages/camera/camera_platform_interface/CHANGELOG.md | 4 ++++ packages/camera/camera_platform_interface/pubspec.yaml | 2 +- packages/camera/camera_web/CHANGELOG.md | 4 ++++ packages/camera/camera_web/pubspec.yaml | 2 +- packages/camera/camera_windows/CHANGELOG.md | 3 ++- packages/camera/camera_windows/pubspec.yaml | 2 +- .../shared_preferences_platform_interface/CHANGELOG.md | 4 ++++ .../shared_preferences_platform_interface/pubspec.yaml | 2 +- 14 files changed, 31 insertions(+), 9 deletions(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index 5320774e6a9..9c2f269b92d 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.10.3+3 +* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. * Aligns Dart and Flutter SDK constraints. ## 0.10.3+2 diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index feaa2739c0f..e6fb8088c8c 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -4,7 +4,7 @@ description: A Flutter plugin for controlling the camera. Supports previewing Dart. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.10.3+2 +version: 0.10.3+3 environment: sdk: ">=2.17.0 <4.0.0" diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index c4c772bfd60..a5e683d9835 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.5+1 + +* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. + ## 0.10.5 * Allows camera to be switched while video recording. diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 88406111468..22f1a059173 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android 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.5 +version: 0.10.5+1 environment: sdk: ">=2.17.0 <4.0.0" diff --git a/packages/camera/camera_avfoundation/CHANGELOG.md b/packages/camera/camera_avfoundation/CHANGELOG.md index a3e714fc33d..cdafa63e762 100644 --- a/packages/camera/camera_avfoundation/CHANGELOG.md +++ b/packages/camera/camera_avfoundation/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.9.13+2 + +* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. + ## 0.9.13+1 * Clarifies explanation of endorsement in README. diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index 64b5d9ae557..c8c7ecda565 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_avfoundation description: iOS implementation of the camera plugin. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_avfoundation issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.9.13+1 +version: 0.9.13+2 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index e0736cac6a0..dec715113c4 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.5.1 + +* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. + ## 2.5.0 * Adds NV21 as an image stream format (suitable for Android). diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 7c3da2d4fc8..93b10fca061 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.5.0 +version: 2.5.1 environment: sdk: ">=2.17.0 <4.0.0" diff --git a/packages/camera/camera_web/CHANGELOG.md b/packages/camera/camera_web/CHANGELOG.md index 5645d129157..2a2bb900ed9 100644 --- a/packages/camera/camera_web/CHANGELOG.md +++ b/packages/camera/camera_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.1+4 + +* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. + ## 0.3.1+3 * Clarifies explanation of endorsement in README. diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index d9f9ab5251b..bed9a4711bf 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_web description: A Flutter plugin for getting information about and controlling the camera on Web. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.3.1+3 +version: 0.3.1+4 environment: sdk: ">=2.17.0 <4.0.0" diff --git a/packages/camera/camera_windows/CHANGELOG.md b/packages/camera/camera_windows/CHANGELOG.md index 2c0c518814e..cf6feca228d 100644 --- a/packages/camera/camera_windows/CHANGELOG.md +++ b/packages/camera/camera_windows/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.2.1+6 +* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. * Aligns Dart and Flutter SDK constraints. ## 0.2.1+5 diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index afbe32d8f5e..a28eba10a76 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_windows description: A Flutter plugin for getting information about and controlling the camera on Windows. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_windows issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.2.1+5 +version: 0.2.1+6 environment: sdk: ">=2.17.0 <4.0.0" diff --git a/packages/shared_preferences/shared_preferences_platform_interface/CHANGELOG.md b/packages/shared_preferences/shared_preferences_platform_interface/CHANGELOG.md index 5f29cb75b63..c1d710dce80 100644 --- a/packages/shared_preferences/shared_preferences_platform_interface/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.2.1 + +* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. + ## 2.2.0 * Adds `getAllWithPrefix` and `clearWithPrefix` method. diff --git a/packages/shared_preferences/shared_preferences_platform_interface/pubspec.yaml b/packages/shared_preferences/shared_preferences_platform_interface/pubspec.yaml index 15e5e59c1c3..ac939528dad 100644 --- a/packages/shared_preferences/shared_preferences_platform_interface/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences_platform_interface/pubspec.yaml @@ -2,7 +2,7 @@ name: shared_preferences_platform_interface description: A common platform interface for the shared_preferences plugin. repository: https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences_platform_interface issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22 -version: 2.2.0 +version: 2.2.1 environment: sdk: ">=2.17.0 <4.0.0" From 869b7878f8e578f5571234c0fc8d4972d3357a97 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Thu, 30 Mar 2023 02:03:46 +0300 Subject: [PATCH 006/108] CameraPlatform.createCameraWithSettings --- .../camera_platform_interface/CHANGELOG.md | 4 ++ .../lib/camera_platform_interface.dart | 1 + .../method_channel/method_channel_camera.dart | 16 +++-- .../platform_interface/camera_platform.dart | 18 ++++- .../lib/src/types/media_settings.dart | 66 +++++++++++++++++++ .../lib/src/types/types.dart | 1 + .../camera_platform_interface/pubspec.yaml | 2 +- .../test/camera_platform_interface_test.dart | 4 +- .../method_channel_camera_test.dart | 33 +++++----- 9 files changed, 118 insertions(+), 27 deletions(-) create mode 100644 packages/camera/camera_platform_interface/lib/src/types/media_settings.dart diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index e0736cac6a0..dec715113c4 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.5.1 + +* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. + ## 2.5.0 * Adds NV21 as an image stream format (suitable for Android). diff --git a/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart b/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart index 6fab99b3d69..25fc417a9cc 100644 --- a/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart +++ b/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart @@ -8,4 +8,5 @@ export 'package:cross_file/cross_file.dart'; export 'src/events/camera_event.dart'; export 'src/events/device_event.dart'; export 'src/platform_interface/camera_platform.dart'; +export 'src/types/media_settings.dart'; export 'src/types/types.dart'; diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index 14d20fc817b..fbd80bcb9a7 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -84,19 +84,21 @@ class MethodChannelCamera extends CameraPlatform { } @override - Future createCamera( + Future createCameraWithSettings( CameraDescription cameraDescription, - ResolutionPreset? resolutionPreset, { - bool enableAudio = false, - }) async { + MediaSettings? mediaSettings, + ) async { try { final Map? reply = await _channel .invokeMapMethod('create', { 'cameraName': cameraDescription.name, - 'resolutionPreset': resolutionPreset != null - ? _serializeResolutionPreset(resolutionPreset) + 'resolutionPreset': null != mediaSettings?.resolutionPreset + ? _serializeResolutionPreset(mediaSettings!.resolutionPreset!) : null, - 'enableAudio': enableAudio, + 'fps': mediaSettings?.fps, + 'videoBitrate': mediaSettings?.videoBitrate, + 'audioBitrate': mediaSettings?.audioBitrate, + 'enableAudio': mediaSettings?.enableAudio ?? false, }); return reply!['cameraId']! as int; diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index b43629d4e0c..b3bd4f7278a 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -47,12 +47,26 @@ abstract class CameraPlatform extends PlatformInterface { } /// Creates an uninitialized camera instance and returns the cameraId. + /// Method will be deprecated. Use [createCameraWithSettings]. Future createCamera( CameraDescription cameraDescription, ResolutionPreset? resolutionPreset, { bool enableAudio = false, - }) { - throw UnimplementedError('createCamera() is not implemented.'); + }) => + createCameraWithSettings( + cameraDescription, + MediaSettings( + resolutionPreset: resolutionPreset, + enableAudio: enableAudio, + ), + ); + + /// Creates an uninitialized camera instance and returns the cameraId. + Future createCameraWithSettings( + CameraDescription cameraDescription, + MediaSettings? mediaSettings, + ) { + throw UnimplementedError('createCameraWithSettings() is not implemented.'); } /// Initializes the camera on the device. diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart new file mode 100644 index 00000000000..a6ade5ecd9e --- /dev/null +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -0,0 +1,66 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// ignore_for_file: avoid_equals_and_hash_code_on_mutable_classes + +import 'resolution_preset.dart'; + +/// recording media settings. +class MediaSettings { + /// constructor + const MediaSettings({ + this.resolutionPreset, + this.fps, + this.videoBitrate, + this.audioBitrate, + this.enableAudio = false, + }); + + /// Default low quality factory + static MediaSettings low({bool enableAudio = true}) => MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: enableAudio, + ); + + /// resolution preset + final ResolutionPreset? resolutionPreset; + + /// camera fps + final int? fps; + + /// recording video bitrate + final int? videoBitrate; + + /// recording audio bitrate + final int? audioBitrate; + + /// enable audio + final bool enableAudio; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is MediaSettings && + runtimeType == other.runtimeType && + resolutionPreset == other.resolutionPreset && + fps == other.fps && + videoBitrate == other.videoBitrate && + audioBitrate == other.audioBitrate && + enableAudio == other.enableAudio; + + @override + int get hashCode => + resolutionPreset.hashCode ^ + fps.hashCode ^ + videoBitrate.hashCode ^ + audioBitrate.hashCode ^ + enableAudio.hashCode; + + @override + String toString() => + 'MediaSettings{resolutionPreset: $resolutionPreset, fps: $fps, videoBitrate: $videoBitrate, audioBitrate: $audioBitrate, enableAudio: $enableAudio}'; +} diff --git a/packages/camera/camera_platform_interface/lib/src/types/types.dart b/packages/camera/camera_platform_interface/lib/src/types/types.dart index a8a4f8ca5dc..f9a81559d68 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/types.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/types.dart @@ -9,5 +9,6 @@ export 'exposure_mode.dart'; export 'flash_mode.dart'; export 'focus_mode.dart'; export 'image_format_group.dart'; +export 'media_settings.dart'; export 'resolution_preset.dart'; export 'video_capture_options.dart'; diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 7c3da2d4fc8..93b10fca061 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.5.0 +version: 2.5.1 environment: sdk: ">=2.17.0 <4.0.0" diff --git a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart index e3b6858e6d2..d08f5921c54 100644 --- a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart +++ b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart @@ -157,13 +157,13 @@ void main() { // Act & Assert expect( - () => cameraPlatform.createCamera( + () => cameraPlatform.createCameraWithSettings( const CameraDescription( name: 'back', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ), throwsUnimplementedError, ); diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index b01123d7cb2..2c6a21ca8de 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -33,12 +33,12 @@ void main() { final MethodChannelCamera camera = MethodChannelCamera(); // Act - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0), - ResolutionPreset.high, + MediaSettings.low(enableAudio: false), ); // Assert @@ -47,7 +47,10 @@ void main() { 'create', arguments: { 'cameraName': 'Test', - 'resolutionPreset': 'high', + 'resolutionPreset': 'low', + 'fps': 15, + 'videoBitrate': 200000, + 'audioBitrate': 32000, 'enableAudio': false }, ), @@ -71,13 +74,13 @@ void main() { // Act expect( - () => camera.createCamera( + () => camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ), throwsA( isA() @@ -105,13 +108,13 @@ void main() { // Act expect( - () => camera.createCamera( + () => camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ), throwsA( isA() @@ -167,13 +170,13 @@ void main() { 'initialize': null }); final MethodChannelCamera camera = MethodChannelCamera(); - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); // Act @@ -214,13 +217,13 @@ void main() { }); final MethodChannelCamera camera = MethodChannelCamera(); - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -262,13 +265,13 @@ void main() { }, ); camera = MethodChannelCamera(); - cameraId = await camera.createCamera( + cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -432,13 +435,13 @@ void main() { }, ); camera = MethodChannelCamera(); - cameraId = await camera.createCamera( + cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + MediaSettings.low(), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add( From a40177a33376bad702554669f1dc65182d61555b Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Fri, 31 Mar 2023 01:14:10 +0300 Subject: [PATCH 007/108] Update CHANGELOG.md --- packages/camera/camera/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index b2bd06b865d..0adf6c3838b 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.10.3+3 -* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. +* Allows recorded video fps and bitrate control. * Updates minimum Flutter version to 3.3. * Aligns Dart and Flutter SDK constraints. From fea1fc759e954f7a5b1db8d30f5690e8b6a354a7 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Fri, 31 Mar 2023 01:25:46 +0300 Subject: [PATCH 008/108] Update camera_test.dart MediaSettings.low changed to const MediaSettings(resolutionPreset: ResolutionPreset.low). --- .../camera/camera/example/integration_test/camera_test.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera/example/integration_test/camera_test.dart b/packages/camera/camera/example/integration_test/camera_test.dart index 831822bbe35..ca073ccfe4d 100644 --- a/packages/camera/camera/example/integration_test/camera_test.dart +++ b/packages/camera/camera/example/integration_test/camera_test.dart @@ -166,7 +166,7 @@ void main() { final CameraController controller = CameraController.withSettings( cameras[0], - mediaSettings: MediaSettings.low(enableAudio: false), + mediaSettings: const MediaSettings(resolutionPreset: ResolutionPreset.low), ); await controller.initialize(); @@ -220,7 +220,7 @@ void main() { final CameraController controller = CameraController.withSettings( cameras[0], - mediaSettings: MediaSettings.low(enableAudio: false), + mediaSettings: const MediaSettings(resolutionPreset: ResolutionPreset.low), ); await controller.initialize(); @@ -251,7 +251,7 @@ void main() { ImageFormatGroup? imageFormatGroup) async { final CameraController controller = CameraController.withSettings( cameras.first, - mediaSettings: MediaSettings.low(enableAudio: false), + mediaSettings: const MediaSettings(resolutionPreset: ResolutionPreset.low), imageFormatGroup: imageFormatGroup, ); From 9f71f8d2cd3c71350642636167f9cab72eb4b54c Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Fri, 31 Mar 2023 01:28:59 +0300 Subject: [PATCH 009/108] Update main.dart --- packages/camera/camera/example/lib/main.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera/example/lib/main.dart b/packages/camera/camera/example/lib/main.dart index b10c5f8ae22..ea45d92dcd8 100644 --- a/packages/camera/camera/example/lib/main.dart +++ b/packages/camera/camera/example/lib/main.dart @@ -647,7 +647,10 @@ class _CameraExampleHomeState extends State final CameraController cameraController = CameraController.withSettings( cameraDescription, - mediaSettings: MediaSettings.low(enableAudio: enableAudio), + mediaSettings: MediaSettings( + resolutionPreset: ResolutionPreset.low, + enableAudio: enableAudio, + ), imageFormatGroup: ImageFormatGroup.jpeg, ); From 4a0ac7728b8dff6f9135a5e4196d2b8fa4d3efc0 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Fri, 31 Mar 2023 01:55:02 +0300 Subject: [PATCH 010/108] MediaSettings.low removed --- .../example/integration_test/camera_test.dart | 21 +- packages/camera/camera/example/lib/main.dart | 5 +- .../example/lib/readme_full_example.dart | 7 +- .../camera/test/camera_image_stream_test.dart | 153 ++- packages/camera/camera/test/camera_test.dart | 874 +++++++++++++----- .../test/android_camera_test.dart | 55 +- .../integration_test/integration_test.dart | 12 +- .../example/lib/main.dart | 7 +- .../test/android_camera_camerax_test.dart | 20 +- .../example/integration_test/camera_test.dart | 35 +- .../camera_avfoundation/example/lib/main.dart | 7 +- .../test/avfoundation_camera_test.dart | 55 +- .../lib/src/types/media_settings.dart | 9 - .../test/camera_platform_interface_test.dart | 8 +- .../method_channel_camera_test.dart | 55 +- .../integration_test/camera_web_test.dart | 10 +- .../camera_windows/example/lib/main.dart | 8 +- .../test/camera_windows_test.dart | 47 +- 18 files changed, 1033 insertions(+), 355 deletions(-) diff --git a/packages/camera/camera/example/integration_test/camera_test.dart b/packages/camera/camera/example/integration_test/camera_test.dart index 831822bbe35..401def58f60 100644 --- a/packages/camera/camera/example/integration_test/camera_test.dart +++ b/packages/camera/camera/example/integration_test/camera_test.dart @@ -166,7 +166,12 @@ void main() { final CameraController controller = CameraController.withSettings( cameras[0], - mediaSettings: MediaSettings.low(enableAudio: false), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), ); await controller.initialize(); @@ -220,7 +225,12 @@ void main() { final CameraController controller = CameraController.withSettings( cameras[0], - mediaSettings: MediaSettings.low(enableAudio: false), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), ); await controller.initialize(); @@ -251,7 +261,12 @@ void main() { ImageFormatGroup? imageFormatGroup) async { final CameraController controller = CameraController.withSettings( cameras.first, - mediaSettings: MediaSettings.low(enableAudio: false), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), imageFormatGroup: imageFormatGroup, ); diff --git a/packages/camera/camera/example/lib/main.dart b/packages/camera/camera/example/lib/main.dart index b10c5f8ae22..ea45d92dcd8 100644 --- a/packages/camera/camera/example/lib/main.dart +++ b/packages/camera/camera/example/lib/main.dart @@ -647,7 +647,10 @@ class _CameraExampleHomeState extends State final CameraController cameraController = CameraController.withSettings( cameraDescription, - mediaSettings: MediaSettings.low(enableAudio: enableAudio), + mediaSettings: MediaSettings( + resolutionPreset: ResolutionPreset.low, + enableAudio: enableAudio, + ), imageFormatGroup: ImageFormatGroup.jpeg, ); diff --git a/packages/camera/camera/example/lib/readme_full_example.dart b/packages/camera/camera/example/lib/readme_full_example.dart index 87ce86bbc3c..a482178a691 100644 --- a/packages/camera/camera/example/lib/readme_full_example.dart +++ b/packages/camera/camera/example/lib/readme_full_example.dart @@ -33,7 +33,12 @@ class _CameraAppState extends State { super.initState(); controller = CameraController.withSettings( _cameras[0], - mediaSettings: MediaSettings.low(), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), ); controller.initialize().then((_) { if (!mounted) { diff --git a/packages/camera/camera/test/camera_image_stream_test.dart b/packages/camera/camera/test/camera_image_stream_test.dart index 39f4d436456..a5885d881cb 100644 --- a/packages/camera/camera/test/camera_image_stream_test.dart +++ b/packages/camera/camera/test/camera_image_stream_test.dart @@ -21,11 +21,18 @@ void main() { test('startImageStream() throws $CameraException when uninitialized', () { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); expect( () => cameraController.startImageStream((CameraImage image) => null), @@ -48,11 +55,18 @@ void main() { test('startImageStream() throws $CameraException when recording videos', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); @@ -71,11 +85,18 @@ void main() { 'startImageStream() throws $CameraException when already streaming images', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); cameraController.value = @@ -91,11 +112,18 @@ void main() { test('startImageStream() calls CameraPlatform', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); await cameraController.startImageStream((CameraImage image) => null); @@ -106,11 +134,18 @@ void main() { test('stopImageStream() throws $CameraException when uninitialized', () { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); expect( cameraController.stopImageStream, @@ -133,11 +168,18 @@ void main() { test('stopImageStream() throws $CameraException when not streaming images', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); expect( @@ -151,11 +193,18 @@ void main() { test('stopImageStream() intended behaviour', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); await cameraController.startImageStream((CameraImage image) => null); await cameraController.stopImageStream(); @@ -166,11 +215,18 @@ void main() { test('startVideoRecording() can stream images', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); @@ -184,11 +240,18 @@ void main() { test('startVideoRecording() by default does not stream', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); diff --git a/packages/camera/camera/test/camera_test.dart b/packages/camera/camera/test/camera_test.dart index 7f22f004746..7a692fda14a 100644 --- a/packages/camera/camera/test/camera_test.dart +++ b/packages/camera/camera/test/camera_test.dart @@ -61,7 +61,13 @@ void main() { const MockCameraDescription description = MockCameraDescription(); final CameraController controller = CameraController.withSettings( description, - mediaSettings: MediaSettings.low(), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); controller.dispose(); @@ -74,7 +80,13 @@ void main() { const MockCameraDescription description = MockCameraDescription(); final CameraController controller = CameraController.withSettings( description, - mediaSettings: MediaSettings.low(), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); expect( @@ -99,11 +111,18 @@ void main() { test('Can be initialized', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); expect(cameraController.value.aspectRatio, 1); @@ -127,11 +146,18 @@ void main() { test('can be disposed', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); expect(cameraController.value.aspectRatio, 1); @@ -145,11 +171,18 @@ void main() { test('initialize() throws CameraException when disposed', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); expect(cameraController.value.aspectRatio, 1); @@ -172,11 +205,18 @@ void main() { test('initialize() throws $CameraException on $PlatformException ', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); mockPlatformException = true; @@ -197,7 +237,13 @@ void main() { name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - mediaSettings: MediaSettings.low(), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), imageFormatGroup: ImageFormatGroup.yuv420, ); await cameraController.initialize(); @@ -208,11 +254,18 @@ void main() { test('prepareForVideoRecording() calls $CameraPlatform ', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); await cameraController.prepareForVideoRecording(); @@ -222,11 +275,18 @@ void main() { test('takePicture() throws $CameraException when uninitialized ', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); expect( cameraController.takePicture(), throwsA( @@ -248,11 +308,18 @@ void main() { test('takePicture() throws $CameraException when takePicture is true', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); cameraController.value = @@ -268,11 +335,18 @@ void main() { test('takePicture() returns $XFile', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); final XFile xFile = await cameraController.takePicture(); @@ -282,11 +356,18 @@ void main() { test('takePicture() throws $CameraException on $PlatformException', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); mockPlatformException = true; @@ -303,11 +384,18 @@ void main() { test('startVideoRecording() throws $CameraException when uninitialized', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); expect( cameraController.startVideoRecording(), @@ -329,11 +417,18 @@ void main() { test('startVideoRecording() throws $CameraException when recording videos', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); @@ -352,11 +447,18 @@ void main() { test('getMaxZoomLevel() throws $CameraException when uninitialized', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); expect( cameraController.getMaxZoomLevel, @@ -378,11 +480,18 @@ void main() { test('getMaxZoomLevel() throws $CameraException when disposed', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); await cameraController.dispose(); @@ -409,11 +518,18 @@ void main() { 'getMaxZoomLevel() throws $CameraException when a platform exception occured.', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance.getMaxZoomLevel(mockInitializeCamera)) @@ -436,11 +552,18 @@ void main() { test('getMaxZoomLevel() returns max zoom level.', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance.getMaxZoomLevel(mockInitializeCamera)) @@ -453,11 +576,18 @@ void main() { test('getMinZoomLevel() throws $CameraException when uninitialized', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); expect( cameraController.getMinZoomLevel, @@ -479,11 +609,18 @@ void main() { test('getMinZoomLevel() throws $CameraException when disposed', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); await cameraController.dispose(); @@ -510,11 +647,18 @@ void main() { 'getMinZoomLevel() throws $CameraException when a platform exception occured.', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance.getMinZoomLevel(mockInitializeCamera)) @@ -537,11 +681,18 @@ void main() { test('getMinZoomLevel() returns max zoom level.', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance.getMinZoomLevel(mockInitializeCamera)) @@ -553,11 +704,18 @@ void main() { test('setZoomLevel() throws $CameraException when uninitialized', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); expect( () => cameraController.setZoomLevel(42.0), @@ -579,11 +737,18 @@ void main() { test('setZoomLevel() throws $CameraException when disposed', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); await cameraController.dispose(); @@ -610,11 +775,18 @@ void main() { 'setZoomLevel() throws $CameraException when a platform exception occured.', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance.setZoomLevel(mockInitializeCamera, 42.0)) @@ -641,11 +813,18 @@ void main() { 'setZoomLevel() completes and calls method channel with correct value.', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); await cameraController.setZoomLevel(42.0); @@ -656,11 +835,18 @@ void main() { test('setFlashMode() calls $CameraPlatform', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); await cameraController.setFlashMode(FlashMode.always); @@ -673,11 +859,18 @@ void main() { test('setFlashMode() throws $CameraException on $PlatformException', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance @@ -700,11 +893,18 @@ void main() { test('setExposureMode() calls $CameraPlatform', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); await cameraController.setExposureMode(ExposureMode.auto); @@ -717,11 +917,18 @@ void main() { test('setExposureMode() throws $CameraException on $PlatformException', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance @@ -744,11 +951,18 @@ void main() { test('setExposurePoint() calls $CameraPlatform', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); await cameraController.setExposurePoint(const Offset(0.5, 0.5)); @@ -761,11 +975,18 @@ void main() { test('setExposurePoint() throws $CameraException on $PlatformException', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance.setExposurePoint( @@ -788,11 +1009,18 @@ void main() { test('getMinExposureOffset() calls $CameraPlatform', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance @@ -809,11 +1037,18 @@ void main() { test('getMinExposureOffset() throws $CameraException on $PlatformException', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance @@ -836,11 +1071,18 @@ void main() { test('getMaxExposureOffset() calls $CameraPlatform', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance @@ -857,11 +1099,18 @@ void main() { test('getMaxExposureOffset() throws $CameraException on $PlatformException', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance @@ -884,11 +1133,18 @@ void main() { test('getExposureOffsetStepSize() calls $CameraPlatform', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance @@ -906,11 +1162,18 @@ void main() { 'getExposureOffsetStepSize() throws $CameraException on $PlatformException', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance @@ -933,11 +1196,18 @@ void main() { test('setExposureOffset() calls $CameraPlatform', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance .getMinExposureOffset(cameraController.cameraId)) @@ -962,11 +1232,18 @@ void main() { test('setExposureOffset() throws $CameraException on $PlatformException', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance .getMinExposureOffset(cameraController.cameraId)) @@ -999,11 +1276,18 @@ void main() { 'setExposureOffset() throws $CameraException when offset is out of bounds', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance .getMinExposureOffset(cameraController.cameraId)) @@ -1056,11 +1340,18 @@ void main() { test('setExposureOffset() rounds offset to nearest step', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance .getMinExposureOffset(cameraController.cameraId)) @@ -1130,11 +1421,18 @@ void main() { test('pausePreview() calls $CameraPlatform', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); cameraController.value = cameraController.value .copyWith(deviceOrientation: DeviceOrientation.portraitUp); @@ -1151,11 +1449,18 @@ void main() { test('pausePreview() does not call $CameraPlatform when already paused', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith(isPreviewPaused: true); @@ -1171,11 +1476,18 @@ void main() { 'pausePreview() sets previewPauseOrientation according to locked orientation', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith( isPreviewPaused: false, @@ -1194,11 +1506,18 @@ void main() { test('pausePreview() throws $CameraException on $PlatformException', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance.pausePreview(cameraController.cameraId)) .thenThrow( @@ -1219,11 +1538,18 @@ void main() { test('resumePreview() calls $CameraPlatform', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith(isPreviewPaused: true); @@ -1238,11 +1564,18 @@ void main() { test('resumePreview() does not call $CameraPlatform when not paused', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith(isPreviewPaused: false); @@ -1257,11 +1590,18 @@ void main() { test('resumePreview() throws $CameraException on $PlatformException', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith(isPreviewPaused: true); @@ -1284,11 +1624,18 @@ void main() { test('lockCaptureOrientation() calls $CameraPlatform', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); await cameraController.lockCaptureOrientation(); @@ -1311,11 +1658,18 @@ void main() { 'lockCaptureOrientation() throws $CameraException on $PlatformException', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance.lockCaptureOrientation( cameraController.cameraId, DeviceOrientation.portraitUp)) @@ -1337,11 +1691,18 @@ void main() { test('unlockCaptureOrientation() calls $CameraPlatform', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); await cameraController.unlockCaptureOrientation(); @@ -1356,11 +1717,18 @@ void main() { 'unlockCaptureOrientation() throws $CameraException on $PlatformException', () async { final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: MediaSettings.low()); + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await cameraController.initialize(); when(CameraPlatform.instance .unlockCaptureOrientation(cameraController.cameraId)) diff --git a/packages/camera/camera_android/test/android_camera_test.dart b/packages/camera/camera_android/test/android_camera_test.dart index 160389f65c0..6fa33f350d5 100644 --- a/packages/camera/camera_android/test/android_camera_test.dart +++ b/packages/camera/camera_android/test/android_camera_test.dart @@ -63,7 +63,12 @@ void main() { name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0), - MediaSettings.low(enableAudio: false), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), ); // Assert @@ -102,7 +107,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ), throwsA( isA() @@ -133,7 +144,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ), throwsA( isA() @@ -195,7 +212,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); // Act @@ -242,7 +265,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -290,7 +319,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -463,7 +498,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add( diff --git a/packages/camera/camera_android_camerax/example/integration_test/integration_test.dart b/packages/camera/camera_android_camerax/example/integration_test/integration_test.dart index d1dd977fe35..94999115e8c 100644 --- a/packages/camera/camera_android_camerax/example/integration_test/integration_test.dart +++ b/packages/camera/camera_android_camerax/example/integration_test/integration_test.dart @@ -39,8 +39,16 @@ void main() { return; } for (final CameraDescription cameraDescription in availableCameras) { - final CameraController controller = CameraController(cameraDescription, - mediaSettings: MediaSettings.low()); + final CameraController controller = CameraController( + cameraDescription, + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ); await controller.initialize(); // Take Picture diff --git a/packages/camera/camera_android_camerax/example/lib/main.dart b/packages/camera/camera_android_camerax/example/lib/main.dart index 0e8bdf0d598..bd3ca9e8eea 100644 --- a/packages/camera/camera_android_camerax/example/lib/main.dart +++ b/packages/camera/camera_android_camerax/example/lib/main.dart @@ -617,7 +617,12 @@ class _CameraExampleHomeState extends State final CameraController cameraController = CameraController( cameraDescription, - mediaSettings: MediaSettings.low(enableAudio: enableAudio), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), imageFormatGroup: ImageFormatGroup.jpeg, ); 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 3f805c719fe..13e069c3411 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 @@ -115,7 +115,15 @@ void main() { expect( await camera.createCameraWithSettings( - testCameraDescription, MediaSettings.low()), + testCameraDescription, + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), + ), equals(testSurfaceTextureId)); // Verify permissions are requested and the camera starts listening for device orientation changes. @@ -205,7 +213,13 @@ void main() { .thenAnswer((_) async => cameraId); await camera.createCameraWithSettings( testCameraDescription, - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); when(camera.processCameraProvider!.bindToLifecycle(camera.cameraSelector!, @@ -271,7 +285,7 @@ void main() { }); test( - 'onDeviceOrientationChanged stream emits changes in device oreintation detected by system services', + 'onDeviceOrientationChanged stream emits changes in device orientation detected by system services', () async { final AndroidCameraCameraX camera = AndroidCameraCameraX(); final Stream eventStream = diff --git a/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart b/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart index 36d872fbe77..e98cfff3535 100644 --- a/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart +++ b/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart @@ -167,7 +167,12 @@ void main() { final CameraController controller = CameraController.withSettings( cameras[0], - mediaSettings: MediaSettings.low(enableAudio: false), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), ); await controller.initialize(); @@ -220,7 +225,12 @@ void main() { final CameraController controller = CameraController.withSettings( cameras[0], - mediaSettings: MediaSettings.low(enableAudio: false), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), ); await controller.initialize(); @@ -241,7 +251,12 @@ void main() { final CameraController controller = CameraController.withSettings( cameras[0], - mediaSettings: MediaSettings.low(enableAudio: false), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), ); await controller.initialize(); @@ -255,7 +270,12 @@ void main() { ImageFormatGroup? imageFormatGroup) async { final CameraController controller = CameraController.withSettings( cameras.first, - mediaSettings: MediaSettings.low(enableAudio: false), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), imageFormatGroup: imageFormatGroup, ); @@ -310,7 +330,12 @@ void main() { final CameraController controller = CameraController.withSettings( cameras[0], - mediaSettings: MediaSettings.low(enableAudio: false), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), ); await controller.initialize(); diff --git a/packages/camera/camera_avfoundation/example/lib/main.dart b/packages/camera/camera_avfoundation/example/lib/main.dart index 91fecbf8c33..322ea747c3b 100644 --- a/packages/camera/camera_avfoundation/example/lib/main.dart +++ b/packages/camera/camera_avfoundation/example/lib/main.dart @@ -650,7 +650,12 @@ class _CameraExampleHomeState extends State CameraDescription cameraDescription) async { final CameraController cameraController = CameraController.withSettings( cameraDescription, - mediaSettings: MediaSettings.low(enableAudio: enableAudio), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), imageFormatGroup: ImageFormatGroup.jpeg, ); diff --git a/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart b/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart index c5b186830cc..ba255c5b5ad 100644 --- a/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart +++ b/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart @@ -63,7 +63,12 @@ void main() { name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0), - MediaSettings.low(enableAudio: false), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), ); // Assert @@ -102,7 +107,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ), throwsA( isA() @@ -133,7 +144,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ), throwsA( isA() @@ -195,7 +212,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); // Act @@ -242,7 +265,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -290,7 +319,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -463,7 +498,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add( diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart index a6ade5ecd9e..8727b4e7872 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -17,15 +17,6 @@ class MediaSettings { this.enableAudio = false, }); - /// Default low quality factory - static MediaSettings low({bool enableAudio = true}) => MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: enableAudio, - ); - /// resolution preset final ResolutionPreset? resolutionPreset; diff --git a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart index d08f5921c54..b3ea1d4e82c 100644 --- a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart +++ b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart @@ -163,7 +163,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ), throwsUnimplementedError, ); diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index 2c6a21ca8de..c22cc18f66c 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -38,7 +38,12 @@ void main() { name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0), - MediaSettings.low(enableAudio: false), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), ); // Assert @@ -80,7 +85,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ), throwsA( isA() @@ -114,7 +125,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ), throwsA( isA() @@ -176,7 +193,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); // Act @@ -223,7 +246,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -271,7 +300,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -441,7 +476,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add( diff --git a/packages/camera/camera_web/example/integration_test/camera_web_test.dart b/packages/camera/camera_web/example/integration_test/camera_web_test.dart index b5a839362fd..5847149db9e 100644 --- a/packages/camera/camera_web/example/integration_test/camera_web_test.dart +++ b/packages/camera/camera_web/example/integration_test/camera_web_test.dart @@ -628,7 +628,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ), throwsA( isA().having( @@ -2455,7 +2461,7 @@ void main() { final FakeMediaError error = FakeMediaError( MediaError.MEDIA_ERR_NETWORK, - 'A network error occured.', + 'A network error occurred.', ); final CameraErrorCode errorCode = diff --git a/packages/camera/camera_windows/example/lib/main.dart b/packages/camera/camera_windows/example/lib/main.dart index d6b6c055a61..cb41e72adf3 100644 --- a/packages/camera/camera_windows/example/lib/main.dart +++ b/packages/camera/camera_windows/example/lib/main.dart @@ -31,7 +31,13 @@ class _MyAppState extends State { bool _recordingTimed = false; bool _previewPaused = false; Size? _previewSize; - MediaSettings _mediaSettings = MediaSettings.low(); + MediaSettings _mediaSettings = const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ); StreamSubscription? _errorStreamSubscription; StreamSubscription? _cameraClosingStreamSubscription; diff --git a/packages/camera/camera_windows/test/camera_windows_test.dart b/packages/camera/camera_windows/test/camera_windows_test.dart index cd9c8d6e334..228cae2c952 100644 --- a/packages/camera/camera_windows/test/camera_windows_test.dart +++ b/packages/camera/camera_windows/test/camera_windows_test.dart @@ -40,7 +40,12 @@ void main() { name: 'Test', lensDirection: CameraLensDirection.front, sensorOrientation: 0), - MediaSettings.low(enableAudio: false), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), ); // Assert @@ -82,7 +87,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ), throwsA( isA() @@ -147,7 +158,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); // Act @@ -184,7 +201,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); await plugin.initializeCamera(cameraId); @@ -226,7 +249,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); await plugin.initializeCamera(cameraId); }); @@ -305,7 +334,13 @@ void main() { lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - MediaSettings.low(), + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); await plugin.initializeCamera(cameraId); }); From 8fcf1ae434d7f82816dda7b6bda3e3f8f377979f Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Fri, 31 Mar 2023 02:08:14 +0300 Subject: [PATCH 011/108] media settings low --- packages/camera/camera/example/lib/main.dart | 3 +++ packages/camera/camera/example/lib/readme_full_example.dart | 1 + 2 files changed, 4 insertions(+) diff --git a/packages/camera/camera/example/lib/main.dart b/packages/camera/camera/example/lib/main.dart index ea45d92dcd8..56c522c7d88 100644 --- a/packages/camera/camera/example/lib/main.dart +++ b/packages/camera/camera/example/lib/main.dart @@ -649,6 +649,9 @@ class _CameraExampleHomeState extends State cameraDescription, mediaSettings: MediaSettings( resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, enableAudio: enableAudio, ), imageFormatGroup: ImageFormatGroup.jpeg, diff --git a/packages/camera/camera/example/lib/readme_full_example.dart b/packages/camera/camera/example/lib/readme_full_example.dart index a482178a691..1935892566a 100644 --- a/packages/camera/camera/example/lib/readme_full_example.dart +++ b/packages/camera/camera/example/lib/readme_full_example.dart @@ -38,6 +38,7 @@ class _CameraAppState extends State { fps: 15, videoBitrate: 200000, audioBitrate: 32000, + enableAudio: true, ), ); controller.initialize().then((_) { From 16645efa2ffdf16d96ca4cc0eceda70c30404478 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Fri, 31 Mar 2023 02:37:30 +0300 Subject: [PATCH 012/108] =?UTF-8?q?resolved=20multiple=20@hellohuanlin=20?= =?UTF-8?q?=D0=B7=D0=BA=D1=89=D0=B7=C3=91proposals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/camera/camera/README.md | 8 +++++++- packages/camera/camera/example/pubspec.yaml | 1 - packages/camera/camera/pubspec.yaml | 1 - .../camera/camera_android/example/pubspec.yaml | 1 - packages/camera/camera_android/pubspec.yaml | 1 - .../camera_android_camerax/example/pubspec.yaml | 1 - .../camera/camera_android_camerax/pubspec.yaml | 1 - .../camera_avfoundation/example/pubspec.yaml | 1 - .../camera_avfoundation/ios/Classes/FLTCam.m | 16 +++++++++------- packages/camera/camera_avfoundation/pubspec.yaml | 1 - packages/camera/camera_web/example/pubspec.yaml | 1 - packages/camera/camera_web/pubspec.yaml | 1 - .../camera/camera_windows/example/pubspec.yaml | 1 - packages/camera/camera_windows/pubspec.yaml | 1 - 14 files changed, 16 insertions(+), 20 deletions(-) diff --git a/packages/camera/camera/README.md b/packages/camera/camera/README.md index f2ed9fbb937..2d36b57d4f3 100644 --- a/packages/camera/camera/README.md +++ b/packages/camera/camera/README.md @@ -129,7 +129,13 @@ class _CameraAppState extends State { super.initState(); controller = CameraController.withSettings( _cameras[0], - mediaSettings: MediaSettings.low(), + mediaSettings: const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); controller.initialize().then((_) { if (!mounted) { diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index 1af9d3efe3f..009f2e508a8 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -22,7 +22,6 @@ dependencies: video_player: ^2.1.4 -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index ec6b907e4fc..87b10e6f0b3 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -39,7 +39,6 @@ dev_dependencies: plugin_platform_interface: ^2.0.0 video_player: ^2.0.0 -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: {camera_android: {path: ../../camera/camera_android}, camera_avfoundation: {path: ../../camera/camera_avfoundation}, camera_platform_interface: {path: ../../camera/camera_platform_interface}, camera_web: {path: ../../camera/camera_web}} diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index f95ec1bdeec..a561d5fd82a 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -22,7 +22,6 @@ dependencies: video_player: ^2.1.4 -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 22f1a059173..9ae14699759 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -31,7 +31,6 @@ dev_dependencies: flutter_test: sdk: flutter -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index 498280137f8..ea457092f80 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -20,7 +20,6 @@ dependencies: video_player: ^2.4.10 -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index e4cda94e982..1c6fabd1176 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -33,7 +33,6 @@ dev_dependencies: mockito: 5.4.0 pigeon: ^9.1.0 -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index ed7b402666b..69712109872 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -22,7 +22,6 @@ dependencies: video_player: ^2.1.4 -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: diff --git a/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m b/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m index 4dbbe3e6bb1..c9eb4daed6a 100644 --- a/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m +++ b/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m @@ -209,11 +209,14 @@ - (AVCaptureConnection *)createConnection:(NSError **)error { if (_fps) { [_videoCaptureSession beginConfiguration]; NSError *outError; - [_captureDevice lockForConfiguration:&outError]; - _captureDevice.activeVideoMinFrameDuration = CMTimeMake(1, [_fps intValue]); - _captureDevice.activeVideoMaxFrameDuration = CMTimeMake(1, [_fps intValue]); - [_videoCaptureSession commitConfiguration]; - [_captureDevice unlockForConfiguration]; + if ([_captureDevice lockForConfiguration:&outError]) { + _captureDevice.activeVideoMinFrameDuration = CMTimeMake(1, [_fps intValue]); + _captureDevice.activeVideoMaxFrameDuration = CMTimeMake(1, [_fps intValue]); + [_videoCaptureSession commitConfiguration]; + [_captureDevice unlockForConfiguration]; + } else { + NSLog(@"error locking device for frame rate change (%@)", outError); + } } return connection; @@ -1130,7 +1133,7 @@ - (BOOL)setupWriterForPath:(NSString *)path { recommendedVideoSettingsForAssetWriterWithOutputFileType:AVFileTypeMPEG4] mutableCopy]; if (_videoBitrate || _fps) { - NSMutableDictionary *compressionProperties = [@{} mutableCopy]; + NSMutableDictionary *compressionProperties = [[NSMutableDictionary alloc] init]; if (_videoBitrate) { compressionProperties[AVVideoAverageBitRateKey] = _videoBitrate; @@ -1169,7 +1172,6 @@ - (BOOL)setupWriterForPath:(NSString *)path { } mutableCopy]; if (_audioBitrate) { - // Both type of audio inputs causes output video file to be corrupted. audioOutputSettings[AVEncoderBitRateKey] = _audioBitrate; } diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index c8c7ecda565..782104b4f73 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -29,7 +29,6 @@ dev_dependencies: flutter_test: sdk: flutter -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index fe1507a7f8f..e573096d829 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -10,7 +10,6 @@ dependencies: sdk: flutter -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index bed9a4711bf..6d59f320dd1 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -28,7 +28,6 @@ dev_dependencies: flutter_test: sdk: flutter -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_windows/example/pubspec.yaml b/packages/camera/camera_windows/example/pubspec.yaml index 19e6d13ce95..4e379868370 100644 --- a/packages/camera/camera_windows/example/pubspec.yaml +++ b/packages/camera/camera_windows/example/pubspec.yaml @@ -19,7 +19,6 @@ dependencies: sdk: flutter -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index a28eba10a76..b3ea6bb0bfa 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -28,7 +28,6 @@ dev_dependencies: flutter_test: sdk: flutter -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: {camera_platform_interface: {path: ../../camera/camera_platform_interface}} From d7dea543b7f22c2293879badc92d91c6ae0189ac Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Fri, 31 Mar 2023 03:13:08 +0300 Subject: [PATCH 013/108] fps control --- .../camera_avfoundation/ios/Classes/FLTCam.m | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m b/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m index c9eb4daed6a..c69f5364a6e 100644 --- a/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m +++ b/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m @@ -177,7 +177,22 @@ - (instancetype)initWithCameraName:(NSString *)cameraName _motionManager = [[CMMotionManager alloc] init]; [_motionManager startAccelerometerUpdates]; - [self setCaptureSessionPreset:_resolutionPreset]; + NSError *outError; + if ([_captureDevice lockForConfiguration:&outError]) { + [_videoCaptureSession beginConfiguration]; + + [self setCaptureSessionPreset:_resolutionPreset]; + + if (_fps) { + _captureDevice.activeVideoMinFrameDuration = CMTimeMake(1, [_fps intValue]); + _captureDevice.activeVideoMaxFrameDuration = CMTimeMake(1, [_fps intValue]); + } + [_videoCaptureSession commitConfiguration]; + [_captureDevice unlockForConfiguration]; + } else { + NSLog(@"error locking device for frame rate change (%@)", outError); + } + [self updateOrientation]; return self; @@ -206,19 +221,6 @@ - (AVCaptureConnection *)createConnection:(NSError **)error { connection.videoMirrored = YES; } - if (_fps) { - [_videoCaptureSession beginConfiguration]; - NSError *outError; - if ([_captureDevice lockForConfiguration:&outError]) { - _captureDevice.activeVideoMinFrameDuration = CMTimeMake(1, [_fps intValue]); - _captureDevice.activeVideoMaxFrameDuration = CMTimeMake(1, [_fps intValue]); - [_videoCaptureSession commitConfiguration]; - [_captureDevice unlockForConfiguration]; - } else { - NSLog(@"error locking device for frame rate change (%@)", outError); - } - } - return connection; } @@ -1139,7 +1141,7 @@ - (BOOL)setupWriterForPath:(NSString *)path { compressionProperties[AVVideoAverageBitRateKey] = _videoBitrate; } - if (_videoBitrate) { + if (_fps) { compressionProperties[AVVideoExpectedSourceFrameRateKey] = _fps; } From 6caea7e76ae31172eec428be2ef41b48f5382f62 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Fri, 31 Mar 2023 11:26:58 +0300 Subject: [PATCH 014/108] Fixed pausing preview on already paused or closed session. --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 9 +++++++-- 1 file changed, 7 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 1a263221217..c717317a988 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 @@ -1110,8 +1110,13 @@ public void unlockCaptureOrientation() { /** Pause the preview from dart. */ public void pausePreview() throws CameraAccessException { - this.pausedPreview = true; - this.captureSession.stopRepeating(); + if (!this.pausedPreview) { + this.pausedPreview = true; + + if (null != this.captureSession) { + this.captureSession.stopRepeating(); + } + } } /** Resume the preview from dart. */ From 4bec8f3d2dca0dc45116ce3121a54bd6d4b7d941 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Fri, 31 Mar 2023 11:43:34 +0300 Subject: [PATCH 015/108] Prevent pausing preview on uninitialized controller. --- .../camera/lib/src/camera_controller.dart | 78 ++++++++----------- 1 file changed, 31 insertions(+), 47 deletions(-) diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index 4aa7293f9a5..cddc3d5db2b 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -177,16 +177,14 @@ class CameraValue { flashMode: flashMode ?? this.flashMode, exposureMode: exposureMode ?? this.exposureMode, focusMode: focusMode ?? this.focusMode, - exposurePointSupported: - exposurePointSupported ?? this.exposurePointSupported, + exposurePointSupported: exposurePointSupported ?? this.exposurePointSupported, focusPointSupported: focusPointSupported ?? this.focusPointSupported, deviceOrientation: deviceOrientation ?? this.deviceOrientation, lockedCaptureOrientation: lockedCaptureOrientation == null ? this.lockedCaptureOrientation : lockedCaptureOrientation.orNull, - recordingOrientation: recordingOrientation == null - ? this.recordingOrientation - : recordingOrientation.orNull, + recordingOrientation: + recordingOrientation == null ? this.recordingOrientation : recordingOrientation.orNull, isPreviewPaused: isPreviewPaused ?? this.isPreviewPaused, previewPauseOrientation: previewPauseOrientation == null ? this.previewPauseOrientation @@ -230,8 +228,7 @@ class CameraController extends ValueNotifier { ResolutionPreset resolutionPreset, { bool enableAudio = true, this.imageFormatGroup, - }) : mediaSettings = MediaSettings( - resolutionPreset: resolutionPreset, enableAudio: enableAudio), + }) : mediaSettings = MediaSettings(resolutionPreset: resolutionPreset, enableAudio: enableAudio), super(const CameraValue.uninitialized()); /// Creates a new camera controller in an uninitialized state, using specified media settings like fps and bitrate. @@ -265,8 +262,7 @@ class CameraController extends ValueNotifier { bool _isDisposed = false; StreamSubscription? _imageStreamSubscription; FutureOr? _initCalled; - StreamSubscription? - _deviceOrientationSubscription; + StreamSubscription? _deviceOrientationSubscription; /// Checks whether [CameraController.dispose] has completed successfully. /// @@ -319,17 +315,16 @@ class CameraController extends ValueNotifier { value = value.copyWith( isInitialized: true, - previewSize: await initializeCompleter.future - .then((CameraInitializedEvent event) => Size( - event.previewWidth, - event.previewHeight, - )), + previewSize: await initializeCompleter.future.then((CameraInitializedEvent event) => Size( + event.previewWidth, + event.previewHeight, + )), exposureMode: await initializeCompleter.future .then((CameraInitializedEvent event) => event.exposureMode), focusMode: await initializeCompleter.future .then((CameraInitializedEvent event) => event.focusMode), - exposurePointSupported: await initializeCompleter.future.then( - (CameraInitializedEvent event) => event.exposurePointSupported), + exposurePointSupported: await initializeCompleter.future + .then((CameraInitializedEvent event) => event.exposurePointSupported), focusPointSupported: await initializeCompleter.future .then((CameraInitializedEvent event) => event.focusPointSupported), ); @@ -357,9 +352,10 @@ class CameraController extends ValueNotifier { /// Pauses the current camera preview Future pausePreview() async { - if (value.isPreviewPaused) { + if (value.isPreviewPaused || !value.isInitialized) { return; } + try { await CameraPlatform.instance.pausePreview(_cameraId); value = value.copyWith( @@ -488,8 +484,7 @@ class CameraController extends ValueNotifier { /// /// The video is returned as a [XFile] after calling [stopVideoRecording]. /// Throws a [CameraException] if the capture fails. - Future startVideoRecording( - {onLatestImageAvailable? onAvailable}) async { + Future startVideoRecording({onLatestImageAvailable? onAvailable}) async { _throwIfNotInitialized('startVideoRecording'); if (value.isRecordingVideo) { throw CameraException( @@ -506,8 +501,8 @@ class CameraController extends ValueNotifier { } try { - await CameraPlatform.instance.startVideoCapturing( - VideoCaptureOptions(_cameraId, streamCallback: streamCallback)); + await CameraPlatform.instance + .startVideoCapturing(VideoCaptureOptions(_cameraId, streamCallback: streamCallback)); value = value.copyWith( isRecordingVideo: true, isRecordingPaused: false, @@ -536,8 +531,7 @@ class CameraController extends ValueNotifier { } try { - final XFile file = - await CameraPlatform.instance.stopVideoRecording(_cameraId); + final XFile file = await CameraPlatform.instance.stopVideoRecording(_cameraId); value = value.copyWith( isRecordingVideo: false, recordingOrientation: const Optional.absent(), @@ -655,10 +649,8 @@ class CameraController extends ValueNotifier { /// Supplying a `null` value will reset the exposure point to it's default /// value. Future setExposurePoint(Offset? point) async { - if (point != null && - (point.dx < 0 || point.dx > 1 || point.dy < 0 || point.dy > 1)) { - throw ArgumentError( - 'The values of point should be anywhere between (0,0) and (1,1).'); + if (point != null && (point.dx < 0 || point.dx > 1 || point.dy < 0 || point.dy > 1)) { + throw ArgumentError('The values of point should be anywhere between (0,0) and (1,1).'); } try { @@ -722,8 +714,8 @@ class CameraController extends ValueNotifier { Future setExposureOffset(double offset) async { _throwIfNotInitialized('setExposureOffset'); // Check if offset is in range - final List range = await Future.wait( - >[getMinExposureOffset(), getMaxExposureOffset()]); + final List range = + await Future.wait(>[getMinExposureOffset(), getMaxExposureOffset()]); if (offset < range[0] || offset > range[1]) { throw CameraException( 'exposureOffsetOutOfBounds', @@ -756,11 +748,11 @@ class CameraController extends ValueNotifier { /// If [orientation] is omitted, the current device orientation is used. Future lockCaptureOrientation([DeviceOrientation? orientation]) async { try { - await CameraPlatform.instance.lockCaptureOrientation( - _cameraId, orientation ?? value.deviceOrientation); + await CameraPlatform.instance + .lockCaptureOrientation(_cameraId, orientation ?? value.deviceOrientation); value = value.copyWith( - lockedCaptureOrientation: Optional.of( - orientation ?? value.deviceOrientation)); + lockedCaptureOrientation: + Optional.of(orientation ?? value.deviceOrientation)); } on PlatformException catch (e) { throw CameraException(e.code, e.message); } @@ -780,8 +772,7 @@ class CameraController extends ValueNotifier { Future unlockCaptureOrientation() async { try { await CameraPlatform.instance.unlockCaptureOrientation(_cameraId); - value = value.copyWith( - lockedCaptureOrientation: const Optional.absent()); + value = value.copyWith(lockedCaptureOrientation: const Optional.absent()); } on PlatformException catch (e) { throw CameraException(e.code, e.message); } @@ -792,10 +783,8 @@ class CameraController extends ValueNotifier { /// Supplying a `null` value will reset the focus point to it's default /// value. Future setFocusPoint(Offset? point) async { - if (point != null && - (point.dx < 0 || point.dx > 1 || point.dy < 0 || point.dy > 1)) { - throw ArgumentError( - 'The values of point should be anywhere between (0,0) and (1,1).'); + if (point != null && (point.dx < 0 || point.dx > 1 || point.dy < 0 || point.dy > 1)) { + throw ArgumentError('The values of point should be anywhere between (0,0) and (1,1).'); } try { await CameraPlatform.instance.setFocusPoint( @@ -926,9 +915,7 @@ class Optional extends IterableBase { /// /// The transformer must not return `null`. If it does, an [ArgumentError] is thrown. Optional transform(S Function(T value) transformer) { - return _value == null - ? Optional.absent() - : Optional.of(transformer(_value as T)); + return _value == null ? Optional.absent() : Optional.of(transformer(_value as T)); } /// Transforms the Optional value. @@ -943,8 +930,7 @@ class Optional extends IterableBase { } @override - Iterator get iterator => - isPresent ? [_value as T].iterator : Iterable.empty().iterator; + Iterator get iterator => isPresent ? [_value as T].iterator : Iterable.empty().iterator; /// Delegates to the underlying [value] hashCode. @override @@ -956,8 +942,6 @@ class Optional extends IterableBase { @override String toString() { - return _value == null - ? 'Optional { absent }' - : 'Optional { value: $_value }'; + return _value == null ? 'Optional { absent }' : 'Optional { value: $_value }'; } } From 11b43c1e279ce7939a12d73b939a3cd12b77db80 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Fri, 31 Mar 2023 11:49:51 +0300 Subject: [PATCH 016/108] Prevent pausing preview on disposed controller. --- packages/camera/camera/lib/src/camera_controller.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index cddc3d5db2b..92241d8d9f3 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -352,7 +352,7 @@ class CameraController extends ValueNotifier { /// Pauses the current camera preview Future pausePreview() async { - if (value.isPreviewPaused || !value.isInitialized) { + if (value.isPreviewPaused || !value.isInitialized || _isDisposed) { return; } From dbb752dcd1a2764eaf1530fe56c3715a9fadc577 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Sat, 1 Apr 2023 02:00:26 +0300 Subject: [PATCH 017/108] formatted --- .../camera/lib/src/camera_controller.dart | 75 ++++++++++++------- 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index 92241d8d9f3..86d50e4119b 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -177,14 +177,16 @@ class CameraValue { flashMode: flashMode ?? this.flashMode, exposureMode: exposureMode ?? this.exposureMode, focusMode: focusMode ?? this.focusMode, - exposurePointSupported: exposurePointSupported ?? this.exposurePointSupported, + exposurePointSupported: + exposurePointSupported ?? this.exposurePointSupported, focusPointSupported: focusPointSupported ?? this.focusPointSupported, deviceOrientation: deviceOrientation ?? this.deviceOrientation, lockedCaptureOrientation: lockedCaptureOrientation == null ? this.lockedCaptureOrientation : lockedCaptureOrientation.orNull, - recordingOrientation: - recordingOrientation == null ? this.recordingOrientation : recordingOrientation.orNull, + recordingOrientation: recordingOrientation == null + ? this.recordingOrientation + : recordingOrientation.orNull, isPreviewPaused: isPreviewPaused ?? this.isPreviewPaused, previewPauseOrientation: previewPauseOrientation == null ? this.previewPauseOrientation @@ -228,7 +230,8 @@ class CameraController extends ValueNotifier { ResolutionPreset resolutionPreset, { bool enableAudio = true, this.imageFormatGroup, - }) : mediaSettings = MediaSettings(resolutionPreset: resolutionPreset, enableAudio: enableAudio), + }) : mediaSettings = MediaSettings( + resolutionPreset: resolutionPreset, enableAudio: enableAudio), super(const CameraValue.uninitialized()); /// Creates a new camera controller in an uninitialized state, using specified media settings like fps and bitrate. @@ -262,7 +265,8 @@ class CameraController extends ValueNotifier { bool _isDisposed = false; StreamSubscription? _imageStreamSubscription; FutureOr? _initCalled; - StreamSubscription? _deviceOrientationSubscription; + StreamSubscription? + _deviceOrientationSubscription; /// Checks whether [CameraController.dispose] has completed successfully. /// @@ -315,16 +319,17 @@ class CameraController extends ValueNotifier { value = value.copyWith( isInitialized: true, - previewSize: await initializeCompleter.future.then((CameraInitializedEvent event) => Size( - event.previewWidth, - event.previewHeight, - )), + previewSize: await initializeCompleter.future + .then((CameraInitializedEvent event) => Size( + event.previewWidth, + event.previewHeight, + )), exposureMode: await initializeCompleter.future .then((CameraInitializedEvent event) => event.exposureMode), focusMode: await initializeCompleter.future .then((CameraInitializedEvent event) => event.focusMode), - exposurePointSupported: await initializeCompleter.future - .then((CameraInitializedEvent event) => event.exposurePointSupported), + exposurePointSupported: await initializeCompleter.future.then( + (CameraInitializedEvent event) => event.exposurePointSupported), focusPointSupported: await initializeCompleter.future .then((CameraInitializedEvent event) => event.focusPointSupported), ); @@ -484,7 +489,8 @@ class CameraController extends ValueNotifier { /// /// The video is returned as a [XFile] after calling [stopVideoRecording]. /// Throws a [CameraException] if the capture fails. - Future startVideoRecording({onLatestImageAvailable? onAvailable}) async { + Future startVideoRecording( + {onLatestImageAvailable? onAvailable}) async { _throwIfNotInitialized('startVideoRecording'); if (value.isRecordingVideo) { throw CameraException( @@ -501,8 +507,8 @@ class CameraController extends ValueNotifier { } try { - await CameraPlatform.instance - .startVideoCapturing(VideoCaptureOptions(_cameraId, streamCallback: streamCallback)); + await CameraPlatform.instance.startVideoCapturing( + VideoCaptureOptions(_cameraId, streamCallback: streamCallback)); value = value.copyWith( isRecordingVideo: true, isRecordingPaused: false, @@ -531,7 +537,8 @@ class CameraController extends ValueNotifier { } try { - final XFile file = await CameraPlatform.instance.stopVideoRecording(_cameraId); + final XFile file = + await CameraPlatform.instance.stopVideoRecording(_cameraId); value = value.copyWith( isRecordingVideo: false, recordingOrientation: const Optional.absent(), @@ -649,8 +656,10 @@ class CameraController extends ValueNotifier { /// Supplying a `null` value will reset the exposure point to it's default /// value. Future setExposurePoint(Offset? point) async { - if (point != null && (point.dx < 0 || point.dx > 1 || point.dy < 0 || point.dy > 1)) { - throw ArgumentError('The values of point should be anywhere between (0,0) and (1,1).'); + if (point != null && + (point.dx < 0 || point.dx > 1 || point.dy < 0 || point.dy > 1)) { + throw ArgumentError( + 'The values of point should be anywhere between (0,0) and (1,1).'); } try { @@ -714,8 +723,8 @@ class CameraController extends ValueNotifier { Future setExposureOffset(double offset) async { _throwIfNotInitialized('setExposureOffset'); // Check if offset is in range - final List range = - await Future.wait(>[getMinExposureOffset(), getMaxExposureOffset()]); + final List range = await Future.wait( + >[getMinExposureOffset(), getMaxExposureOffset()]); if (offset < range[0] || offset > range[1]) { throw CameraException( 'exposureOffsetOutOfBounds', @@ -748,11 +757,11 @@ class CameraController extends ValueNotifier { /// If [orientation] is omitted, the current device orientation is used. Future lockCaptureOrientation([DeviceOrientation? orientation]) async { try { - await CameraPlatform.instance - .lockCaptureOrientation(_cameraId, orientation ?? value.deviceOrientation); + await CameraPlatform.instance.lockCaptureOrientation( + _cameraId, orientation ?? value.deviceOrientation); value = value.copyWith( - lockedCaptureOrientation: - Optional.of(orientation ?? value.deviceOrientation)); + lockedCaptureOrientation: Optional.of( + orientation ?? value.deviceOrientation)); } on PlatformException catch (e) { throw CameraException(e.code, e.message); } @@ -772,7 +781,8 @@ class CameraController extends ValueNotifier { Future unlockCaptureOrientation() async { try { await CameraPlatform.instance.unlockCaptureOrientation(_cameraId); - value = value.copyWith(lockedCaptureOrientation: const Optional.absent()); + value = value.copyWith( + lockedCaptureOrientation: const Optional.absent()); } on PlatformException catch (e) { throw CameraException(e.code, e.message); } @@ -783,8 +793,10 @@ class CameraController extends ValueNotifier { /// Supplying a `null` value will reset the focus point to it's default /// value. Future setFocusPoint(Offset? point) async { - if (point != null && (point.dx < 0 || point.dx > 1 || point.dy < 0 || point.dy > 1)) { - throw ArgumentError('The values of point should be anywhere between (0,0) and (1,1).'); + if (point != null && + (point.dx < 0 || point.dx > 1 || point.dy < 0 || point.dy > 1)) { + throw ArgumentError( + 'The values of point should be anywhere between (0,0) and (1,1).'); } try { await CameraPlatform.instance.setFocusPoint( @@ -915,7 +927,9 @@ class Optional extends IterableBase { /// /// The transformer must not return `null`. If it does, an [ArgumentError] is thrown. Optional transform(S Function(T value) transformer) { - return _value == null ? Optional.absent() : Optional.of(transformer(_value as T)); + return _value == null + ? Optional.absent() + : Optional.of(transformer(_value as T)); } /// Transforms the Optional value. @@ -930,7 +944,8 @@ class Optional extends IterableBase { } @override - Iterator get iterator => isPresent ? [_value as T].iterator : Iterable.empty().iterator; + Iterator get iterator => + isPresent ? [_value as T].iterator : Iterable.empty().iterator; /// Delegates to the underlying [value] hashCode. @override @@ -942,6 +957,8 @@ class Optional extends IterableBase { @override String toString() { - return _value == null ? 'Optional { absent }' : 'Optional { value: $_value }'; + return _value == null + ? 'Optional { absent }' + : 'Optional { value: $_value }'; } } From 3506af11726bb1bdbc1c23fbc22e20b553ab0b5e Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Wed, 26 Apr 2023 10:52:39 +0300 Subject: [PATCH 018/108] Update packages/camera/camera_android/CHANGELOG.md Co-authored-by: Camille Simon <43054281+camsim99@users.noreply.github.com> --- packages/camera/camera_android/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index a5e683d9835..4ffd785a5b6 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.10.5+1 -* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. +* Adds `CameraPlatfrom.createCameraWithSettings` to allow recorded video fps and bitrate control. ## 0.10.5 From 8f95dc2d45d5052e3a779f51992696f70ea1f2ca Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Wed, 26 Apr 2023 11:44:56 +0300 Subject: [PATCH 019/108] Update packages/camera/camera/CHANGELOG.md Co-authored-by: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> --- packages/camera/camera/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index 0adf6c3838b..57b826fb517 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.10.3+3 -* Allows recorded video fps and bitrate control. +* Adds support to control video fps and bitrate. * Updates minimum Flutter version to 3.3. * Aligns Dart and Flutter SDK constraints. From 6b1f96c7813202ceee2220bddfd18b0d7cf4bc35 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 26 Apr 2023 10:56:20 +0300 Subject: [PATCH 020/108] bump gradle:7.20 in CHANGELOG --- packages/camera/camera_android/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index 4ffd785a5b6..31ef59b4764 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.10.5+1 * Adds `CameraPlatfrom.createCameraWithSettings` to allow recorded video fps and bitrate control. +* Bump: `com.android.tools.build:gradle:7.2.0` ## 0.10.5 From 6f97b51cd847bcb795760752d34cd3eff32d6dd6 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 26 Apr 2023 11:00:38 +0300 Subject: [PATCH 021/108] commented feature properties --- .../camera/features/CameraFeatures.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java index be89cb6b20e..e9e8b6db5a8 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java @@ -287,26 +287,56 @@ public void setZoomLevel(ZoomLevelFeature zoomLevel) { this.featureMap.put(ZOOM_LEVEL, zoomLevel); } + /** + * Sets the instance of the fps feature. + * + * @param fps the {@link IntFeature} instance to set. + */ public void setFps(IntFeature fps) { this.featureMap.put(FPS, fps); } + /** + * Gets the fps feature if it has been set. + * + * @return the fps feature. + */ public IntFeature getFps() { return (IntFeature) featureMap.get(FPS); } + /** + * Sets the instance of the videoBitrate feature. + * + * @param videoBitrate the {@link IntFeature} instance to set. + */ public void setVideoBitrate(IntFeature videoBitrate) { this.featureMap.put(VIDEO_BITRATE, videoBitrate); } + /** + * Gets the videoBitrate feature if it has been set. + * + * @return the videoBitrate feature. + */ public IntFeature getVideoBitrate() { return (IntFeature) featureMap.get(VIDEO_BITRATE); } + /** + * Sets the instance of the getAudioBitrate feature. + * + * @param getAudioBitrate the {@link IntFeature} instance to set. + */ public void setAudioBitrate(IntFeature audioBitrate) { this.featureMap.put(AUDIO_BITRATE, audioBitrate); } + /** + * Gets the getAudioBitrate feature if it has been set. + * + * @return the getAudioBitrate feature. + */ public IntFeature getAudioBitrate() { return (IntFeature) featureMap.get(AUDIO_BITRATE); } From d96f9d50bb0abddc2827d4decc67bcae153ce98a Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 26 Apr 2023 11:22:11 +0300 Subject: [PATCH 022/108] android_camera_camerax CHANGELOD update --- packages/camera/camera_android_camerax/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index cfe8bbc7221..d3be31d8196 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,5 +1,5 @@ ## NEXT - +* `com.android.tools.build:gradle:7.2.0` (at least now '7.2.0' is the version of gradle, required by apps, generated with current stable flutter: 3.7.12) * Updates minimum Flutter version to 3.3. * Creates camera_android_camerax plugin for development. * Adds CameraInfo class and removes unnecessary code from plugin. From 401adcef7e6c46453e7446c6d8c4c6ade1fdf280 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 26 Apr 2023 11:24:57 +0300 Subject: [PATCH 023/108] revert default enableAudio to false --- .../camera_android_camerax/lib/src/android_camera_camerax.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5219f51f3f1..823f1d1f5d2 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 @@ -128,7 +128,7 @@ class AndroidCameraCameraX extends CameraPlatform { MediaSettings? mediaSettings, ) async { // Must obtain proper permissions before attempting to access a camera. - await requestCameraPermissions(mediaSettings?.enableAudio ?? true); + await requestCameraPermissions(mediaSettings?.enableAudio ?? false); // Save CameraSelector that matches cameraDescription. final int cameraSelectorLensDirection = From 8edd2124a7e5aab0112fbdbddefdb9a4fdd528ed Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 26 Apr 2023 11:29:21 +0300 Subject: [PATCH 024/108] properly commented IntFeature --- .../flutter/plugins/camera/features/intfeature/IntFeature.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java index 8701965af98..c999ff89d99 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java @@ -8,7 +8,7 @@ import io.flutter.plugins.camera.CameraProperties; import io.flutter.plugins.camera.features.CameraFeature; -/** Controls the zoom configuration on the {@link android.hardware.camera2} API. */ +/** Used to control the fps, videoBitrate and audioBitrate configuration on the {@link android.hardware.camera2} API. */ public class IntFeature extends CameraFeature { private Integer currentValue; From 0a8fe17e1d452286659161430498e23e08fba4ae Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 26 Apr 2023 11:36:00 +0300 Subject: [PATCH 025/108] clarify test constants --- .../media/MediaRecorderBuilderTest.java | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java index f53b10508f3..3438d3e3270 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java @@ -21,13 +21,18 @@ @RunWith(RobolectricTestRunner.class) public class MediaRecorderBuilderTest { + + private static final int testVideoBitrate = 200000; + private static final int testFps = 15; + private static final int testAudioBitrate = 32000; + @Config(maxSdk = 30) @SuppressWarnings("deprecation") @Test public void ctor_testLegacy() { MediaRecorderBuilder builder = new MediaRecorderBuilder( - CamcorderProfile.get(CamcorderProfile.QUALITY_1080P), "", 15, 200000, 32000); + CamcorderProfile.get(CamcorderProfile.QUALITY_1080P), "", testFps, testVideoBitrate, testAudioBitrate); assertNotNull(builder); } @@ -37,7 +42,7 @@ public void ctor_testLegacy() { public void ctor_test() { MediaRecorderBuilder builder = new MediaRecorderBuilder( - CamcorderProfile.getAll("0", CamcorderProfile.QUALITY_1080P), "", 15, 200000, 32000); + CamcorderProfile.getAll("0", CamcorderProfile.QUALITY_1080P), "", testFps, testVideoBitrate, testAudioBitrate); assertNotNull(builder); } @@ -74,7 +79,7 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabledLegacy() throw String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, 15, 200000, 32000) + new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, testFps, testVideoBitrate, testAudioBitrate) .setEnableAudio(false) .setMediaOrientation(mediaOrientation); @@ -86,8 +91,8 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabledLegacy() throw inOrder.verify(recorder).setVideoSource(MediaRecorder.VideoSource.SURFACE); inOrder.verify(recorder).setOutputFormat(recorderProfile.fileFormat); inOrder.verify(recorder).setVideoEncoder(recorderProfile.videoCodec); - inOrder.verify(recorder).setVideoEncodingBitRate(200000); - inOrder.verify(recorder).setVideoFrameRate(15); + inOrder.verify(recorder).setVideoEncodingBitRate(testVideoBitrate); + inOrder.verify(recorder).setVideoFrameRate(testFps); inOrder .verify(recorder) .setVideoSize(recorderProfile.videoFrameWidth, recorderProfile.videoFrameHeight); @@ -110,7 +115,7 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabled() throws IOEx String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, 15, 200000, 32000) + new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, testFps, testVideoBitrate, testAudioBitrate) .setEnableAudio(false) .setMediaOrientation(mediaOrientation); @@ -126,8 +131,8 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabled() throws IOEx inOrder.verify(recorder).setVideoSource(MediaRecorder.VideoSource.SURFACE); inOrder.verify(recorder).setOutputFormat(recorderProfile.getRecommendedFileFormat()); inOrder.verify(recorder).setVideoEncoder(videoProfile.getCodec()); - inOrder.verify(recorder).setVideoEncodingBitRate(200000); - inOrder.verify(recorder).setVideoFrameRate(15); + inOrder.verify(recorder).setVideoEncodingBitRate(testVideoBitrate); + inOrder.verify(recorder).setVideoFrameRate(testFps); inOrder.verify(recorder).setVideoSize(videoProfile.getWidth(), videoProfile.getHeight()); inOrder.verify(recorder).setOutputFile(outputFilePath); inOrder.verify(recorder).setOrientationHint(mediaOrientation); @@ -144,7 +149,7 @@ public void build_shouldThrowExceptionWithoutVideoOrAudioProfiles() throws IOExc String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, 15, 200000, 32000) + new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, testFps, testVideoBitrate, testAudioBitrate) .setEnableAudio(false) .setMediaOrientation(mediaOrientation); @@ -164,7 +169,7 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabledLegacy() throws String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, 15, 200000, 32000) + new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, testFps, testVideoBitrate, testAudioBitrate) .setEnableAudio(true) .setMediaOrientation(mediaOrientation); @@ -177,11 +182,11 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabledLegacy() throws inOrder.verify(recorder).setVideoSource(MediaRecorder.VideoSource.SURFACE); inOrder.verify(recorder).setOutputFormat(recorderProfile.fileFormat); inOrder.verify(recorder).setAudioEncoder(recorderProfile.audioCodec); - inOrder.verify(recorder).setAudioEncodingBitRate(32000); + inOrder.verify(recorder).setAudioEncodingBitRate(testAudioBitrate); inOrder.verify(recorder).setAudioSamplingRate(recorderProfile.audioSampleRate); inOrder.verify(recorder).setVideoEncoder(recorderProfile.videoCodec); - inOrder.verify(recorder).setVideoEncodingBitRate(200000); - inOrder.verify(recorder).setVideoFrameRate(15); + inOrder.verify(recorder).setVideoEncodingBitRate(testVideoBitrate); + inOrder.verify(recorder).setVideoFrameRate(testFps); inOrder .verify(recorder) .setVideoSize(recorderProfile.videoFrameWidth, recorderProfile.videoFrameHeight); @@ -204,7 +209,7 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabled() throws IOExc String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, 15, 200000, 32000) + new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, testFps, testVideoBitrate, testAudioBitrate) .setEnableAudio(true) .setMediaOrientation(mediaOrientation); @@ -222,11 +227,11 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabled() throws IOExc inOrder.verify(recorder).setVideoSource(MediaRecorder.VideoSource.SURFACE); inOrder.verify(recorder).setOutputFormat(recorderProfile.getRecommendedFileFormat()); inOrder.verify(recorder).setAudioEncoder(audioProfile.getCodec()); - inOrder.verify(recorder).setAudioEncodingBitRate(32000); + inOrder.verify(recorder).setAudioEncodingBitRate(testAudioBitrate); inOrder.verify(recorder).setAudioSamplingRate(audioProfile.getSampleRate()); inOrder.verify(recorder).setVideoEncoder(videoProfile.getCodec()); - inOrder.verify(recorder).setVideoEncodingBitRate(200000); - inOrder.verify(recorder).setVideoFrameRate(15); + inOrder.verify(recorder).setVideoEncodingBitRate(testVideoBitrate); + inOrder.verify(recorder).setVideoFrameRate(testFps); inOrder.verify(recorder).setVideoSize(videoProfile.getWidth(), videoProfile.getHeight()); inOrder.verify(recorder).setOutputFile(outputFilePath); inOrder.verify(recorder).setOrientationHint(mediaOrientation); From d072dfbeaa3d4b92bd81ba5012bc4f1f5e7682f9 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 26 Apr 2023 12:35:29 +0300 Subject: [PATCH 026/108] pass logic to to _getTargetResolutionForPreview --- .../lib/src/android_camera_camerax.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 823f1d1f5d2..05ef9b33eec 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 @@ -151,9 +151,7 @@ class AndroidCameraCameraX extends CameraPlatform { _getTargetRotation(cameraDescription.sensorOrientation); final ResolutionInfo? previewTargetResolution = - null != mediaSettings?.resolutionPreset - ? _getTargetResolutionForPreview(mediaSettings!.resolutionPreset) - : null; + _getTargetResolutionForPreview(mediaSettings?.resolutionPreset); preview = createPreview(targetRotation, previewTargetResolution); From accef7c09cce0ed1affc27270aac40de53fd99a9 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 26 Apr 2023 12:43:04 +0300 Subject: [PATCH 027/108] versions fix --- packages/camera/camera/CHANGELOG.md | 2 +- packages/camera/camera/pubspec.yaml | 2 +- .../shared_preferences_platform_interface/CHANGELOG.md | 4 ---- .../shared_preferences_platform_interface/pubspec.yaml | 2 +- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index 57b826fb517..8679c2b34af 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.10.3+3 +## 0.10.4 * Adds support to control video fps and bitrate. * Updates minimum Flutter version to 3.3. diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index 87b10e6f0b3..e8e85a56500 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -4,7 +4,7 @@ description: A Flutter plugin for controlling the camera. Supports previewing Dart. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.10.3+3 +version: 0.10.4 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/shared_preferences/shared_preferences_platform_interface/CHANGELOG.md b/packages/shared_preferences/shared_preferences_platform_interface/CHANGELOG.md index c1d710dce80..5f29cb75b63 100644 --- a/packages/shared_preferences/shared_preferences_platform_interface/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences_platform_interface/CHANGELOG.md @@ -1,7 +1,3 @@ -## 2.2.1 - -* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. - ## 2.2.0 * Adds `getAllWithPrefix` and `clearWithPrefix` method. diff --git a/packages/shared_preferences/shared_preferences_platform_interface/pubspec.yaml b/packages/shared_preferences/shared_preferences_platform_interface/pubspec.yaml index ac939528dad..15e5e59c1c3 100644 --- a/packages/shared_preferences/shared_preferences_platform_interface/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences_platform_interface/pubspec.yaml @@ -2,7 +2,7 @@ name: shared_preferences_platform_interface description: A common platform interface for the shared_preferences plugin. repository: https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences_platform_interface issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22 -version: 2.2.1 +version: 2.2.0 environment: sdk: ">=2.17.0 <4.0.0" From 480761c3f33c44fab189a354eca78c857adf707e Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Wed, 26 Apr 2023 12:44:47 +0300 Subject: [PATCH 028/108] Update packages/camera/camera_platform_interface/lib/src/types/media_settings.dart Co-authored-by: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> --- .../camera_platform_interface/lib/src/types/media_settings.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart index 8727b4e7872..0915be66e32 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -8,7 +8,7 @@ import 'resolution_preset.dart'; /// recording media settings. class MediaSettings { - /// constructor + /// Creates a [MediaSettings]. const MediaSettings({ this.resolutionPreset, this.fps, From bdd74a863e955f127bb6b4c047da9c35566ee67e Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 26 Apr 2023 12:55:24 +0300 Subject: [PATCH 029/108] Comments improved --- .../src/platform_interface/camera_platform.dart | 1 + .../lib/src/types/media_settings.dart | 15 +++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index b3bd4f7278a..fa1df2ce316 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -47,6 +47,7 @@ abstract class CameraPlatform extends PlatformInterface { } /// Creates an uninitialized camera instance and returns the cameraId. + /// /// Method will be deprecated. Use [createCameraWithSettings]. Future createCamera( CameraDescription cameraDescription, diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart index 0915be66e32..833176952d1 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -6,7 +6,10 @@ import 'resolution_preset.dart'; -/// recording media settings. +/// Recording media settings. +/// +/// Used in [CameraPlatform.createCameraWithSettings]. +/// Allows to tune recorded video parameters, such as resolution, frame rate, bitrate. class MediaSettings { /// Creates a [MediaSettings]. const MediaSettings({ @@ -17,19 +20,19 @@ class MediaSettings { this.enableAudio = false, }); - /// resolution preset + /// [ResolutionPreset] affect the quality of video recording and image capture. final ResolutionPreset? resolutionPreset; - /// camera fps + /// Rate at which frames should be captured by the camera in frames per second. final int? fps; - /// recording video bitrate + /// Sets the video encoding bit rate for recording. final int? videoBitrate; - /// recording audio bitrate + /// Sets the audio encoding bit rate for recording. final int? audioBitrate; - /// enable audio + /// Controls audio presence in recorded video. final bool enableAudio; @override From ec5856ffea1ec69af16e376d68a1bbef180b403e Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 26 Apr 2023 13:03:39 +0300 Subject: [PATCH 030/108] minor version increased. --- packages/camera/camera_platform_interface/CHANGELOG.md | 2 +- packages/camera/camera_platform_interface/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index dec715113c4..88222eee3fa 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,4 +1,4 @@ -## 2.5.1 +## 2.6.0 * CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 93b10fca061..40e83350541 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.5.1 +version: 2.6.0 environment: sdk: ">=2.17.0 <4.0.0" From 673680241bbc052c8b3e5d4b4dea4b9a4add963d Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 26 Apr 2023 13:12:32 +0300 Subject: [PATCH 031/108] resolve upstream conflict --- packages/camera/camera/example/lib/main.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/camera/camera/example/lib/main.dart b/packages/camera/camera/example/lib/main.dart index 56c522c7d88..9475e2696d5 100644 --- a/packages/camera/camera/example/lib/main.dart +++ b/packages/camera/camera/example/lib/main.dart @@ -643,8 +643,13 @@ class _CameraExampleHomeState extends State // re-creates the controller. controller = null; await oldController.dispose(); + } else { + return _initializeCameraController(cameraDescription); } + } + Future _initializeCameraController( + CameraDescription cameraDescription) async { final CameraController cameraController = CameraController.withSettings( cameraDescription, mediaSettings: MediaSettings( From 86c95e928ae26439b92357f249f6fd5a1631f04c Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 12:55:42 +0300 Subject: [PATCH 032/108] flutter 3.10.3 + analysis: error 'Found an extra analysis_options.yaml' --- .../camera/camera_android_camerax/analysis_options.yaml | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 packages/camera/camera_android_camerax/analysis_options.yaml diff --git a/packages/camera/camera_android_camerax/analysis_options.yaml b/packages/camera/camera_android_camerax/analysis_options.yaml deleted file mode 100644 index 7c19fabd68d..00000000000 --- a/packages/camera/camera_android_camerax/analysis_options.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# TODO(stuartmorgan): Remove this file and fix all the unawaited_futures -# violations. See https://github.com/flutter/flutter/issues/127323 - -include: ../../../analysis_options.yaml - -linter: - rules: - unawaited_futures: false From c78cfc5a29007b45bbeebe5d0de55f9e241f9b52 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 12:57:19 +0300 Subject: [PATCH 033/108] multiple analysis issues: const, await etc. --- .../camera/lib/src/camera_controller.dart | 6 +- .../camera/test/camera_preview_test.dart | 7 - .../features/intfeature/IntFeature.java | 5 +- .../media/MediaRecorderBuilderTest.java | 52 +++- .../example/lib/camera_controller.dart | 2 +- .../lib/src/android_camera_camerax.dart | 24 +- .../lib/src/image_capture.dart | 2 +- .../lib/src/recording.dart | 8 +- .../test/android_camera_camerax_test.dart | 12 +- .../test/recording_test.dart | 8 +- .../platform_interface/camera_platform.dart | 12 +- .../method_channel_camera_test.dart | 292 +++++++++++------- site-shared | 2 +- 13 files changed, 276 insertions(+), 156 deletions(-) diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index 13e6862cecd..e55ff100457 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -240,11 +240,11 @@ class CameraController extends ValueNotifier { this.imageFormatGroup, }) : mediaSettings = MediaSettings( resolutionPreset: resolutionPreset, enableAudio: enableAudio), - super(const CameraValue.uninitialized(description)); + super(CameraValue.uninitialized(description)); /// Creates a new camera controller in an uninitialized state, using specified media settings like fps and bitrate. CameraController.withSettings( - this.description, { + CameraDescription description, { this.mediaSettings, this.imageFormatGroup, }) : super(CameraValue.uninitialized(description)); @@ -647,7 +647,7 @@ class CameraController extends ValueNotifier { /// /// The supplied [zoom] value should be between 1.0 and the maximum supported /// zoom level returned by the `getMaxZoomLevel`. Throws an `CameraException` - /// when an illegal zoom level is suplied. + /// when an illegal zoom level is supplied. Future setZoomLevel(double zoom) { _throwIfNotInitialized('setZoomLevel'); try { diff --git a/packages/camera/camera/test/camera_preview_test.dart b/packages/camera/camera/test/camera_preview_test.dart index d4fca52c373..a41ec163813 100644 --- a/packages/camera/camera/test/camera_preview_test.dart +++ b/packages/camera/camera/test/camera_preview_test.dart @@ -33,13 +33,6 @@ class FakeController extends ValueNotifier @override void debugCheckIsDisposed() {} - @override - CameraDescription get description => const CameraDescription( - name: '', lensDirection: CameraLensDirection.back, sensorOrientation: 0); - - @override - bool get enableAudio => false; - @override Future getExposureOffsetStepSize() async => 1.0; diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java index c999ff89d99..aabfedb0244 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java @@ -8,7 +8,10 @@ import io.flutter.plugins.camera.CameraProperties; import io.flutter.plugins.camera.features.CameraFeature; -/** Used to control the fps, videoBitrate and audioBitrate configuration on the {@link android.hardware.camera2} API. */ +/** + * Used to control the fps, videoBitrate and audioBitrate configuration on the {@link + * android.hardware.camera2} API. + */ public class IntFeature extends CameraFeature { private Integer currentValue; diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java index 3438d3e3270..314be9cfba4 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java @@ -32,7 +32,11 @@ public class MediaRecorderBuilderTest { public void ctor_testLegacy() { MediaRecorderBuilder builder = new MediaRecorderBuilder( - CamcorderProfile.get(CamcorderProfile.QUALITY_1080P), "", testFps, testVideoBitrate, testAudioBitrate); + CamcorderProfile.get(CamcorderProfile.QUALITY_1080P), + "", + testFps, + testVideoBitrate, + testAudioBitrate); assertNotNull(builder); } @@ -42,7 +46,11 @@ public void ctor_testLegacy() { public void ctor_test() { MediaRecorderBuilder builder = new MediaRecorderBuilder( - CamcorderProfile.getAll("0", CamcorderProfile.QUALITY_1080P), "", testFps, testVideoBitrate, testAudioBitrate); + CamcorderProfile.getAll("0", CamcorderProfile.QUALITY_1080P), + "", + testFps, + testVideoBitrate, + testAudioBitrate); assertNotNull(builder); } @@ -79,7 +87,13 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabledLegacy() throw String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, testFps, testVideoBitrate, testAudioBitrate) + new MediaRecorderBuilder( + recorderProfile, + outputFilePath, + mockFactory, + testFps, + testVideoBitrate, + testAudioBitrate) .setEnableAudio(false) .setMediaOrientation(mediaOrientation); @@ -115,7 +129,13 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabled() throws IOEx String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, testFps, testVideoBitrate, testAudioBitrate) + new MediaRecorderBuilder( + recorderProfile, + outputFilePath, + mockFactory, + testFps, + testVideoBitrate, + testAudioBitrate) .setEnableAudio(false) .setMediaOrientation(mediaOrientation); @@ -149,7 +169,13 @@ public void build_shouldThrowExceptionWithoutVideoOrAudioProfiles() throws IOExc String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, testFps, testVideoBitrate, testAudioBitrate) + new MediaRecorderBuilder( + recorderProfile, + outputFilePath, + mockFactory, + testFps, + testVideoBitrate, + testAudioBitrate) .setEnableAudio(false) .setMediaOrientation(mediaOrientation); @@ -169,7 +195,13 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabledLegacy() throws String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, testFps, testVideoBitrate, testAudioBitrate) + new MediaRecorderBuilder( + recorderProfile, + outputFilePath, + mockFactory, + testFps, + testVideoBitrate, + testAudioBitrate) .setEnableAudio(true) .setMediaOrientation(mediaOrientation); @@ -209,7 +241,13 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabled() throws IOExc String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; MediaRecorderBuilder builder = - new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory, testFps, testVideoBitrate, testAudioBitrate) + new MediaRecorderBuilder( + recorderProfile, + outputFilePath, + mockFactory, + testFps, + testVideoBitrate, + testAudioBitrate) .setEnableAudio(true) .setMediaOrientation(mediaOrientation); diff --git a/packages/camera/camera_android_camerax/example/lib/camera_controller.dart b/packages/camera/camera_android_camerax/example/lib/camera_controller.dart index 0de11636957..10e838ae48e 100644 --- a/packages/camera/camera_android_camerax/example/lib/camera_controller.dart +++ b/packages/camera/camera_android_camerax/example/lib/camera_controller.dart @@ -521,7 +521,7 @@ class CameraController extends ValueNotifier { } if (value.isStreamingImages) { - stopImageStream(); + await stopImageStream(); } try { 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 2b061a92f2f..b44eb73df9c 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 @@ -320,9 +320,9 @@ class AndroidCameraCameraX extends CameraPlatform { @override Future dispose(int cameraId) async { preview?.releaseFlutterSurfaceTexture(); - liveCameraState?.removeObservers(); + await liveCameraState?.removeObservers(); processCameraProvider?.unbindAll(); - imageAnalysis?.clearAnalyzer(); + await imageAnalysis?.clearAnalyzer(); } /// The camera has been initialized. @@ -426,7 +426,7 @@ class AndroidCameraCameraX extends CameraPlatform { /// [cameraId] not used. @override Future pausePreview(int cameraId) async { - _unbindUseCaseFromLifecycle(preview!); + await _unbindUseCaseFromLifecycle(preview!); _previewIsPaused = true; } @@ -510,7 +510,7 @@ class AndroidCameraCameraX extends CameraPlatform { if (videoOutputPath == null) { // Stop the current active recording as we will be unable to complete it // in this error case. - recording!.close(); + await recording!.close(); recording = null; pendingRecording = null; throw CameraException( @@ -519,7 +519,7 @@ class AndroidCameraCameraX extends CameraPlatform { 'while reporting success. The platform should always ' 'return a valid path or report an error.'); } - recording!.close(); + await recording!.close(); recording = null; pendingRecording = null; return XFile(videoOutputPath!); @@ -529,7 +529,7 @@ class AndroidCameraCameraX extends CameraPlatform { @override Future pauseVideoRecording(int cameraId) async { if (recording != null) { - recording!.pause(); + await recording!.pause(); } } @@ -537,7 +537,7 @@ class AndroidCameraCameraX extends CameraPlatform { @override Future resumeVideoRecording(int cameraId) async { if (recording != null) { - recording!.resume(); + await recording!.resume(); } } @@ -617,7 +617,7 @@ class AndroidCameraCameraX extends CameraPlatform { width: imageProxy.width); weakThis.target!.cameraImageDataStreamController!.add(cameraImageData); - imageProxy.close(); + await imageProxy.close(); } // shouldCreateDetachedObjectForTesting is used to create an Analyzer @@ -630,7 +630,7 @@ class AndroidCameraCameraX extends CameraPlatform { // TODO(camsim99): Support resolution configuration. // Defaults to YUV_420_888 image format. imageAnalysis = createImageAnalysis(null); - imageAnalysis!.setAnalyzer(analyzer); + await imageAnalysis!.setAnalyzer(analyzer); // TODO(camsim99): Reset live camera state observers here when // https://github.com/flutter/packages/pull/3419 lands. @@ -655,7 +655,7 @@ class AndroidCameraCameraX extends CameraPlatform { /// The [onListen] callback for the stream controller used for image /// streaming. Future _onFrameStreamListen() async { - _configureAndBindImageAnalysisToLifecycle(); + await _configureAndBindImageAnalysisToLifecycle(); } /// The [onCancel] callback for the stream controller used for image @@ -664,7 +664,7 @@ class AndroidCameraCameraX extends CameraPlatform { /// Removes the previously set analyzer on the [imageAnalysis] instance, since /// image information should no longer be streamed. FutureOr _onFrameStreamCancel() async { - imageAnalysis!.clearAnalyzer(); + await imageAnalysis!.clearAnalyzer(); } /// Converts between Android ImageFormat constants and [ImageFormatGroup]s. @@ -690,7 +690,7 @@ class AndroidCameraCameraX extends CameraPlatform { /// removed, as well. Future _updateLiveCameraState(int cameraId) async { final CameraInfo cameraInfo = await camera!.getCameraInfo(); - liveCameraState?.removeObservers(); + await liveCameraState?.removeObservers(); liveCameraState = await cameraInfo.getCameraState(); await liveCameraState!.observe(_createCameraClosingObserver(cameraId)); } diff --git a/packages/camera/camera_android_camerax/lib/src/image_capture.dart b/packages/camera/camera_android_camerax/lib/src/image_capture.dart index 6a9b2dedd04..4df8f29bcc0 100644 --- a/packages/camera/camera_android_camerax/lib/src/image_capture.dart +++ b/packages/camera/camera_android_camerax/lib/src/image_capture.dart @@ -139,7 +139,7 @@ class ImageCaptureHostApiImpl extends ImageCaptureHostApi { assert(identifier != null, 'No ImageCapture has the identifer of that requested to get the resolution information for.'); - setFlashMode(identifier!, flashMode); + await setFlashMode(identifier!, flashMode); } /// Takes a picture with the specified [ImageCapture] instance. diff --git a/packages/camera/camera_android_camerax/lib/src/recording.dart b/packages/camera/camera_android_camerax/lib/src/recording.dart index 2f21e255b62..5d7c54c37e7 100644 --- a/packages/camera/camera_android_camerax/lib/src/recording.dart +++ b/packages/camera/camera_android_camerax/lib/src/recording.dart @@ -67,22 +67,22 @@ class RecordingHostApiImpl extends RecordingHostApi { /// Closes the specified recording instance. Future closeFromInstance(Recording recording) async { - close(instanceManager.getIdentifier(recording)!); + await close(instanceManager.getIdentifier(recording)!); } /// Pauses the specified recording instance if active. Future pauseFromInstance(Recording recording) async { - pause(instanceManager.getIdentifier(recording)!); + await pause(instanceManager.getIdentifier(recording)!); } /// Resumes the specified recording instance if paused. Future resumeFromInstance(Recording recording) async { - resume(instanceManager.getIdentifier(recording)!); + await resume(instanceManager.getIdentifier(recording)!); } /// Stops the specified recording instance, as if calling closeFromInstance(). Future stopFromInstance(Recording recording) async { - stop(instanceManager.getIdentifier(recording)!); + await stop(instanceManager.getIdentifier(recording)!); } } 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 978b9b9bc3a..9107d798a34 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 @@ -337,11 +337,11 @@ void main() { await camera.createCameraWithSettings( testCameraDescription, const MediaSettings( - resolutionPreset: testResolutionPreset, + resolutionPreset: ResolutionPreset.medium, fps: 15, videoBitrate: 200000, audioBitrate: 32000, - enableAudio: enableAudio, + enableAudio: true, ), ); @@ -367,7 +367,7 @@ void main() { camera.liveCameraState = MockLiveCameraState(); camera.imageAnalysis = MockImageAnalysis(); - camera.dispose(3); + await camera.dispose(3); verify(camera.preview!.releaseFlutterSurfaceTexture()); verify(camera.liveCameraState!.removeObservers()); @@ -709,7 +709,7 @@ void main() { final AndroidCameraCameraX camera = AndroidCameraCameraX(); final MockRecording recording = MockRecording(); camera.recording = recording; - camera.pauseVideoRecording(0); + await camera.pauseVideoRecording(0); verify(recording.pause()); verifyNoMoreInteractions(recording); }); @@ -718,7 +718,7 @@ void main() { final AndroidCameraCameraX camera = AndroidCameraCameraX(); final MockRecording recording = MockRecording(); camera.recording = recording; - camera.resumeVideoRecording(0); + await camera.resumeVideoRecording(0); verify(recording.resume()); verifyNoMoreInteractions(recording); }); @@ -994,7 +994,7 @@ void main() { // Verify camera and cameraInfo were properly updated. expect(camera.camera, equals(mockCamera)); expect(camera.cameraInfo, equals(mockCameraInfo)); - onStreamedFrameAvailableSubscription.cancel(); + await onStreamedFrameAvailableSubscription.cancel(); }); test( diff --git a/packages/camera/camera_android_camerax/test/recording_test.dart b/packages/camera/camera_android_camerax/test/recording_test.dart index 06de01f42bc..b0877e9db13 100644 --- a/packages/camera/camera_android_camerax/test/recording_test.dart +++ b/packages/camera/camera_android_camerax/test/recording_test.dart @@ -37,7 +37,7 @@ void main() { instanceManager.addHostCreatedInstance(recording, recordingId, onCopy: (_) => Recording.detached(instanceManager: instanceManager)); - recording.close(); + await recording.close(); verify(mockApi.close(recordingId)); }); @@ -57,7 +57,7 @@ void main() { instanceManager.addHostCreatedInstance(recording, recordingId, onCopy: (_) => Recording.detached(instanceManager: instanceManager)); - recording.pause(); + await recording.pause(); verify(mockApi.pause(recordingId)); }); @@ -77,7 +77,7 @@ void main() { instanceManager.addHostCreatedInstance(recording, recordingId, onCopy: (_) => Recording.detached(instanceManager: instanceManager)); - recording.resume(); + await recording.resume(); verify(mockApi.resume(recordingId)); }); @@ -97,7 +97,7 @@ void main() { instanceManager.addHostCreatedInstance(recording, recordingId, onCopy: (_) => Recording.detached(instanceManager: instanceManager)); - recording.stop(); + await recording.stop(); verify(mockApi.stop(recordingId)); }); diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index 3eade62a58e..da1e7ada87b 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -112,11 +112,13 @@ abstract class CameraPlatform extends PlatformInterface { /// Implementations for this: /// - Should support all 4 orientations. Stream onDeviceOrientationChanged() { - throw UnimplementedError('onDeviceOrientationChanged() is not implemented.'); + throw UnimplementedError( + 'onDeviceOrientationChanged() is not implemented.'); } /// Locks the capture orientation. - Future lockCaptureOrientation(int cameraId, DeviceOrientation orientation) { + Future lockCaptureOrientation( + int cameraId, DeviceOrientation orientation) { throw UnimplementedError('lockCaptureOrientation() is not implemented.'); } @@ -153,7 +155,8 @@ abstract class CameraPlatform extends PlatformInterface { /// Please see [VideoCaptureOptions] for documentation on the /// configuration options. Future startVideoCapturing(VideoCaptureOptions options) { - return startVideoRecording(options.cameraId, maxVideoDuration: options.maxDuration); + return startVideoRecording(options.cameraId, + maxVideoDuration: options.maxDuration); } /// Stops the video recording and returns the file where it was saved. @@ -281,7 +284,8 @@ abstract class CameraPlatform extends PlatformInterface { /// Sets the active camera while recording. Future setDescriptionWhileRecording(CameraDescription description) { - throw UnimplementedError('setDescriptionWhileRecording() is not implemented.'); + throw UnimplementedError( + 'setDescriptionWhileRecording() is not implemented.'); } /// Returns a widget showing a live camera preview. diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index 7bb6a52bacf..8159cdfe26f 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -22,19 +22,22 @@ void main() { group('Creation, Initialization & Disposal Tests', () { test('Should send creation data and receive back a camera id', () async { // Arrange - final MethodChannelMock cameraMockChannel = - MethodChannelMock(channelName: 'plugins.flutter.io/camera', methods: { - 'create': { - 'cameraId': 1, - 'imageFormatGroup': 'unknown', - } - }); + final MethodChannelMock cameraMockChannel = MethodChannelMock( + channelName: 'plugins.flutter.io/camera', + methods: { + 'create': { + 'cameraId': 1, + 'imageFormatGroup': 'unknown', + } + }); final MethodChannelCamera camera = MethodChannelCamera(); // Act final int cameraId = await camera.createCameraWithSettings( const CameraDescription( - name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0), + name: 'Test', + lensDirection: CameraLensDirection.back, + sensorOrientation: 0), const MediaSettings( resolutionPreset: ResolutionPreset.low, fps: 15, @@ -60,14 +63,18 @@ void main() { expect(cameraId, 1); }); - test('Should throw CameraException when create throws a PlatformException', () { + test( + 'Should throw CameraException when create throws a PlatformException', + () { // Arrange - MethodChannelMock(channelName: 'plugins.flutter.io/camera', methods: { - 'create': PlatformException( - code: 'TESTING_ERROR_CODE', - message: 'Mock error message used during testing.', - ) - }); + MethodChannelMock( + channelName: 'plugins.flutter.io/camera', + methods: { + 'create': PlatformException( + code: 'TESTING_ERROR_CODE', + message: 'Mock error message used during testing.', + ) + }); final MethodChannelCamera camera = MethodChannelCamera(); // Act @@ -88,21 +95,26 @@ void main() { ), throwsA( isA() - .having((CameraException e) => e.code, 'code', 'TESTING_ERROR_CODE') + .having( + (CameraException e) => e.code, 'code', 'TESTING_ERROR_CODE') .having((CameraException e) => e.description, 'description', 'Mock error message used during testing.'), ), ); }); - test('Should throw CameraException when create throws a PlatformException', () { + test( + 'Should throw CameraException when create throws a PlatformException', + () { // Arrange - MethodChannelMock(channelName: 'plugins.flutter.io/camera', methods: { - 'create': PlatformException( - code: 'TESTING_ERROR_CODE', - message: 'Mock error message used during testing.', - ) - }); + MethodChannelMock( + channelName: 'plugins.flutter.io/camera', + methods: { + 'create': PlatformException( + code: 'TESTING_ERROR_CODE', + message: 'Mock error message used during testing.', + ) + }); final MethodChannelCamera camera = MethodChannelCamera(); // Act @@ -123,7 +135,8 @@ void main() { ), throwsA( isA() - .having((CameraException e) => e.code, 'code', 'TESTING_ERROR_CODE') + .having( + (CameraException e) => e.code, 'code', 'TESTING_ERROR_CODE') .having((CameraException e) => e.description, 'description', 'Mock error message used during testing.'), ), @@ -150,7 +163,8 @@ void main() { () => camera.initializeCamera(0), throwsA( isA() - .having((CameraException e) => e.code, 'code', 'TESTING_ERROR_CODE') + .having((CameraException e) => e.code, 'code', + 'TESTING_ERROR_CODE') .having( (CameraException e) => e.description, 'description', @@ -163,14 +177,15 @@ void main() { test('Should send initialization data', () async { // Arrange - final MethodChannelMock cameraMockChannel = - MethodChannelMock(channelName: 'plugins.flutter.io/camera', methods: { - 'create': { - 'cameraId': 1, - 'imageFormatGroup': 'unknown', - }, - 'initialize': null - }); + final MethodChannelMock cameraMockChannel = MethodChannelMock( + channelName: 'plugins.flutter.io/camera', + methods: { + 'create': { + 'cameraId': 1, + 'imageFormatGroup': 'unknown', + }, + 'initialize': null + }); final MethodChannelCamera camera = MethodChannelCamera(); final int cameraId = await camera.createCameraWithSettings( const CameraDescription( @@ -216,12 +231,13 @@ void main() { test('Should send a disposal call on dispose', () async { // Arrange - final MethodChannelMock cameraMockChannel = - MethodChannelMock(channelName: 'plugins.flutter.io/camera', methods: { - 'create': {'cameraId': 1}, - 'initialize': null, - 'dispose': {'cameraId': 1} - }); + final MethodChannelMock cameraMockChannel = MethodChannelMock( + channelName: 'plugins.flutter.io/camera', + methods: { + 'create': {'cameraId': 1}, + 'initialize': null, + 'dispose': {'cameraId': 1} + }); final MethodChannelCamera camera = MethodChannelCamera(); final int cameraId = await camera.createCameraWithSettings( @@ -307,7 +323,8 @@ void main() { test('Should receive initialized event', () async { // Act - final Stream eventStream = camera.onCameraInitialized(cameraId); + final Stream eventStream = + camera.onCameraInitialized(cameraId); final StreamQueue streamQueue = StreamQueue(eventStream); @@ -321,7 +338,8 @@ void main() { FocusMode.auto, true, ); - await camera.handleCameraMethodCall(MethodCall('initialized', event.toJson()), cameraId); + await camera.handleCameraMethodCall( + MethodCall('initialized', event.toJson()), cameraId); // Assert expect(await streamQueue.next, event); @@ -363,15 +381,19 @@ void main() { test('Should receive camera closing events', () async { // Act - final Stream eventStream = camera.onCameraClosing(cameraId); + final Stream eventStream = + camera.onCameraClosing(cameraId); final StreamQueue streamQueue = StreamQueue(eventStream); // Emit test events final CameraClosingEvent event = CameraClosingEvent(cameraId); - await camera.handleCameraMethodCall(MethodCall('camera_closing', event.toJson()), cameraId); - await camera.handleCameraMethodCall(MethodCall('camera_closing', event.toJson()), cameraId); - await camera.handleCameraMethodCall(MethodCall('camera_closing', event.toJson()), cameraId); + await camera.handleCameraMethodCall( + MethodCall('camera_closing', event.toJson()), cameraId); + await camera.handleCameraMethodCall( + MethodCall('camera_closing', event.toJson()), cameraId); + await camera.handleCameraMethodCall( + MethodCall('camera_closing', event.toJson()), cameraId); // Assert expect(await streamQueue.next, event); @@ -384,15 +406,20 @@ void main() { test('Should receive camera error events', () async { // Act - final Stream errorStream = camera.onCameraError(cameraId); + final Stream errorStream = + camera.onCameraError(cameraId); final StreamQueue streamQueue = StreamQueue(errorStream); // Emit test events - final CameraErrorEvent event = CameraErrorEvent(cameraId, 'Error Description'); - await camera.handleCameraMethodCall(MethodCall('error', event.toJson()), cameraId); - await camera.handleCameraMethodCall(MethodCall('error', event.toJson()), cameraId); - await camera.handleCameraMethodCall(MethodCall('error', event.toJson()), cameraId); + final CameraErrorEvent event = + CameraErrorEvent(cameraId, 'Error Description'); + await camera.handleCameraMethodCall( + MethodCall('error', event.toJson()), cameraId); + await camera.handleCameraMethodCall( + MethodCall('error', event.toJson()), cameraId); + await camera.handleCameraMethodCall( + MethodCall('error', event.toJson()), cameraId); // Assert expect(await streamQueue.next, event); @@ -413,9 +440,12 @@ void main() { // Emit test events const DeviceOrientationChangedEvent event = DeviceOrientationChangedEvent(DeviceOrientation.portraitUp); - await camera.handleDeviceMethodCall(MethodCall('orientation_changed', event.toJson())); - await camera.handleDeviceMethodCall(MethodCall('orientation_changed', event.toJson())); - await camera.handleDeviceMethodCall(MethodCall('orientation_changed', event.toJson())); + await camera.handleDeviceMethodCall( + MethodCall('orientation_changed', event.toJson())); + await camera.handleDeviceMethodCall( + MethodCall('orientation_changed', event.toJson())); + await camera.handleDeviceMethodCall( + MethodCall('orientation_changed', event.toJson())); // Assert expect(await streamQueue.next, event); @@ -469,11 +499,20 @@ void main() { await initializeFuture; }); - test('Should fetch CameraDescription instances for available cameras', () async { + test('Should fetch CameraDescription instances for available cameras', + () async { // Arrange final List returnData = [ - {'name': 'Test 1', 'lensFacing': 'front', 'sensorOrientation': 1}, - {'name': 'Test 2', 'lensFacing': 'back', 'sensorOrientation': 2} + { + 'name': 'Test 1', + 'lensFacing': 'front', + 'sensorOrientation': 1 + }, + { + 'name': 'Test 2', + 'lensFacing': 'back', + 'sensorOrientation': 2 + } ]; final MethodChannelMock channel = MethodChannelMock( channelName: 'plugins.flutter.io/camera', @@ -493,28 +532,34 @@ void main() { (returnData[i] as Map).cast(); final CameraDescription cameraDescription = CameraDescription( name: typedData['name']! as String, - lensDirection: parseCameraLensDirection(typedData['lensFacing']! as String), + lensDirection: + parseCameraLensDirection(typedData['lensFacing']! as String), sensorOrientation: typedData['sensorOrientation']! as int, ); expect(cameras[i], cameraDescription); } }); - test('Should throw CameraException when availableCameras throws a PlatformException', () { + test( + 'Should throw CameraException when availableCameras throws a PlatformException', + () { // Arrange - MethodChannelMock(channelName: 'plugins.flutter.io/camera', methods: { - 'availableCameras': PlatformException( - code: 'TESTING_ERROR_CODE', - message: 'Mock error message used during testing.', - ) - }); + MethodChannelMock( + channelName: 'plugins.flutter.io/camera', + methods: { + 'availableCameras': PlatformException( + code: 'TESTING_ERROR_CODE', + message: 'Mock error message used during testing.', + ) + }); // Act expect( camera.availableCameras, throwsA( isA() - .having((CameraException e) => e.code, 'code', 'TESTING_ERROR_CODE') + .having( + (CameraException e) => e.code, 'code', 'TESTING_ERROR_CODE') .having((CameraException e) => e.description, 'description', 'Mock error message used during testing.'), ), @@ -584,17 +629,22 @@ void main() { // Act const CameraDescription cameraDescription = CameraDescription( - name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0); + name: 'Test', + lensDirection: CameraLensDirection.back, + sensorOrientation: 0); await camera.setDescriptionWhileRecording(cameraDescription); // Assert expect(channel.log, [ isMethodCall('setDescriptionWhileRecording', - arguments: {'cameraName': cameraDescription.name}), + arguments: { + 'cameraName': cameraDescription.name + }), ]); }); - test('Should pass maxVideoDuration when starting recording a video', () async { + test('Should pass maxVideoDuration when starting recording a video', + () async { // Arrange final MethodChannelMock channel = MethodChannelMock( channelName: 'plugins.flutter.io/camera', @@ -687,14 +737,22 @@ void main() { // Assert expect(channel.log, [ - isMethodCall('setFlashMode', - arguments: {'cameraId': cameraId, 'mode': 'torch'}), - isMethodCall('setFlashMode', - arguments: {'cameraId': cameraId, 'mode': 'always'}), - isMethodCall('setFlashMode', - arguments: {'cameraId': cameraId, 'mode': 'auto'}), - isMethodCall('setFlashMode', - arguments: {'cameraId': cameraId, 'mode': 'off'}), + isMethodCall('setFlashMode', arguments: { + 'cameraId': cameraId, + 'mode': 'torch' + }), + isMethodCall('setFlashMode', arguments: { + 'cameraId': cameraId, + 'mode': 'always' + }), + isMethodCall('setFlashMode', arguments: { + 'cameraId': cameraId, + 'mode': 'auto' + }), + isMethodCall('setFlashMode', arguments: { + 'cameraId': cameraId, + 'mode': 'off' + }), ]); }); @@ -711,10 +769,14 @@ void main() { // Assert expect(channel.log, [ - isMethodCall('setExposureMode', - arguments: {'cameraId': cameraId, 'mode': 'auto'}), - isMethodCall('setExposureMode', - arguments: {'cameraId': cameraId, 'mode': 'locked'}), + isMethodCall('setExposureMode', arguments: { + 'cameraId': cameraId, + 'mode': 'auto' + }), + isMethodCall('setExposureMode', arguments: { + 'cameraId': cameraId, + 'mode': 'locked' + }), ]); }); @@ -754,7 +816,8 @@ void main() { ); // Act - final double minExposureOffset = await camera.getMinExposureOffset(cameraId); + final double minExposureOffset = + await camera.getMinExposureOffset(cameraId); // Assert expect(minExposureOffset, 2.0); @@ -773,7 +836,8 @@ void main() { ); // Act - final double maxExposureOffset = await camera.getMaxExposureOffset(cameraId); + final double maxExposureOffset = + await camera.getMaxExposureOffset(cameraId); // Assert expect(maxExposureOffset, 2.0); @@ -792,14 +856,16 @@ void main() { ); // Act - final double stepSize = await camera.getExposureOffsetStepSize(cameraId); + final double stepSize = + await camera.getExposureOffsetStepSize(cameraId); // Assert expect(stepSize, 0.25); expect(channel.log, [ - isMethodCall('getExposureOffsetStepSize', arguments: { - 'cameraId': cameraId, - }), + isMethodCall('getExposureOffsetStepSize', + arguments: { + 'cameraId': cameraId, + }), ]); }); @@ -811,7 +877,8 @@ void main() { ); // Act - final double actualOffset = await camera.setExposureOffset(cameraId, 0.5); + final double actualOffset = + await camera.setExposureOffset(cameraId, 0.5); // Assert expect(actualOffset, 0.6); @@ -836,10 +903,14 @@ void main() { // Assert expect(channel.log, [ - isMethodCall('setFocusMode', - arguments: {'cameraId': cameraId, 'mode': 'auto'}), - isMethodCall('setFocusMode', - arguments: {'cameraId': cameraId, 'mode': 'locked'}), + isMethodCall('setFocusMode', arguments: { + 'cameraId': cameraId, + 'mode': 'auto' + }), + isMethodCall('setFocusMode', arguments: { + 'cameraId': cameraId, + 'mode': 'locked' + }), ]); }); @@ -880,10 +951,13 @@ void main() { expect((widget as Texture).textureId, cameraId); }); - test('Should throw MissingPluginException when handling unknown method', () { + test('Should throw MissingPluginException when handling unknown method', + () { final MethodChannelCamera camera = MethodChannelCamera(); - expect(() => camera.handleCameraMethodCall(const MethodCall('unknown_method'), 1), + expect( + () => camera.handleCameraMethodCall( + const MethodCall('unknown_method'), 1), throwsA(isA())); }); @@ -942,7 +1016,8 @@ void main() { ]); }); - test('Should throw CameraException when illegal zoom level is supplied', () async { + test('Should throw CameraException when illegal zoom level is supplied', + () async { // Arrange MethodChannelMock( channelName: 'plugins.flutter.io/camera', @@ -959,8 +1034,8 @@ void main() { () => camera.setZoomLevel(cameraId, -1.0), throwsA(isA() .having((CameraException e) => e.code, 'code', 'ZOOM_ERROR') - .having( - (CameraException e) => e.description, 'description', 'Illegal zoom error'))); + .having((CameraException e) => e.description, 'description', + 'Illegal zoom error'))); }); test('Should lock the capture orientation', () async { @@ -971,12 +1046,15 @@ void main() { ); // Act - await camera.lockCaptureOrientation(cameraId, DeviceOrientation.portraitUp); + await camera.lockCaptureOrientation( + cameraId, DeviceOrientation.portraitUp); // Assert expect(channel.log, [ - isMethodCall('lockCaptureOrientation', - arguments: {'cameraId': cameraId, 'orientation': 'portraitUp'}), + isMethodCall('lockCaptureOrientation', arguments: { + 'cameraId': cameraId, + 'orientation': 'portraitUp' + }), ]); }); @@ -1009,7 +1087,8 @@ void main() { // Assert expect(channel.log, [ - isMethodCall('pausePreview', arguments: {'cameraId': cameraId}), + isMethodCall('pausePreview', + arguments: {'cameraId': cameraId}), ]); }); @@ -1025,7 +1104,8 @@ void main() { // Assert expect(channel.log, [ - isMethodCall('resumePreview', arguments: {'cameraId': cameraId}), + isMethodCall('resumePreview', + arguments: {'cameraId': cameraId}), ]); }); @@ -1040,8 +1120,9 @@ void main() { ); // Act - final StreamSubscription subscription = - camera.onStreamedFrameAvailable(cameraId).listen((CameraImageData imageData) {}); + final StreamSubscription subscription = camera + .onStreamedFrameAvailable(cameraId) + .listen((CameraImageData imageData) {}); // Assert expect(channel.log, [ @@ -1062,8 +1143,9 @@ void main() { ); // Act - final StreamSubscription subscription = - camera.onStreamedFrameAvailable(cameraId).listen((CameraImageData imageData) {}); + final StreamSubscription subscription = camera + .onStreamedFrameAvailable(cameraId) + .listen((CameraImageData imageData) {}); await subscription.cancel(); // Assert diff --git a/site-shared b/site-shared index 8c92e5bdfdc..d12bf9ba015 160000 --- a/site-shared +++ b/site-shared @@ -1 +1 @@ -Subproject commit 8c92e5bdfdce14887605de6b5d9d0bd2615876b7 +Subproject commit d12bf9ba015be7f8be9e92da62000a0a48f3e4ff From 55978389dfbb604643a3dd714fb11ba6a71f3fd5 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 13:14:12 +0300 Subject: [PATCH 034/108] expectLater for exceptions checking on async methods --- .../test/android_camera_camerax_test.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 9107d798a34..695f9ebb8ed 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 @@ -765,8 +765,8 @@ void main() { camera.recording = recording; camera.videoOutputPath = null; - expect( - () => camera.stopVideoRecording(0), throwsA(isA())); + await expectLater( + camera.stopVideoRecording(0), throwsA(isA())); expect(camera.recording, null); }); @@ -788,8 +788,8 @@ void main() { final XFile file = await camera.stopVideoRecording(0); expect(file.path, videoOutputPath); - expect( - () => camera.stopVideoRecording(0), throwsA(isA())); + await expectLater( + camera.stopVideoRecording(0), throwsA(isA())); }); }); From d0068207031863198cb06833f62fc8e0733c1e4b Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 13:14:58 +0300 Subject: [PATCH 035/108] order of call and verify for mockito is important --- .../test/android_camera_camerax_test.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 695f9ebb8ed..bd5e0faf7c0 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 @@ -972,14 +972,16 @@ void main() { imageDataCompleter.complete(imageData); }); - // Test ImageAnalysis use case is bound to ProcessCameraProvider. final Analyzer capturedAnalyzer = verify(camera.mockImageAnalysis.setAnalyzer(captureAny)).captured.single as Analyzer; + + await capturedAnalyzer.analyze(mockImageProxy); + + // Test ImageAnalysis use case is bound to ProcessCameraProvider. verify(mockProcessCameraProvider.bindToLifecycle( mockCameraSelector, [camera.mockImageAnalysis])); - await capturedAnalyzer.analyze(mockImageProxy); final CameraImageData imageData = await imageDataCompleter.future; // Test Analyzer correctly process ImageProxy instances. From f60804d6618e76efb0691419d241e916fbaca088 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 14:33:20 +0300 Subject: [PATCH 036/108] ios tests passed --- .../example/ios/Runner.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_avfoundation/example/ios/Runner.xcodeproj/project.pbxproj b/packages/camera/camera_avfoundation/example/ios/Runner.xcodeproj/project.pbxproj index 7ce926c77d3..3454e81fcc3 100644 --- a/packages/camera/camera_avfoundation/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/camera/camera_avfoundation/example/ios/Runner.xcodeproj/project.pbxproj @@ -490,7 +490,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = S984M7CLA3; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = RunnerTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -520,7 +520,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = S984M7CLA3; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = RunnerTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; From d21dd5b5e338c118846e03c2ab8241c609b955a5 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 15:00:18 +0300 Subject: [PATCH 037/108] lint suppress --- .../flutter/plugins/camera/features/intfeature/IntFeature.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java index aabfedb0244..19f454db720 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java @@ -26,6 +26,8 @@ public String getDebugName() { return "IntFeature"; } + @SuppressLint("KotlinPropertyAccess") + @Nullable @Override public Integer getValue() { return currentValue; From b08f5f18954fd7e7f398a4374b33c216254b0cac Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 15:07:50 +0300 Subject: [PATCH 038/108] annotation imports --- .../flutter/plugins/camera/features/intfeature/IntFeature.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java index 19f454db720..4317b2ddfe6 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java @@ -4,7 +4,9 @@ package io.flutter.plugins.camera.features.intfeature; +import android.annotation.SuppressLint; import android.hardware.camera2.CaptureRequest; +import androidx.annotation.Nullable; import io.flutter.plugins.camera.CameraProperties; import io.flutter.plugins.camera.features.CameraFeature; From d361800b2ec6bc47974f40c5be89e6699efa7398 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 15:34:21 +0300 Subject: [PATCH 039/108] mark IntFeature usages as NonNull --- .../flutter/plugins/camera/features/CameraFeatures.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java index 1d5f41867da..ed602e840bd 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java @@ -307,7 +307,7 @@ public void setZoomLevel(@NonNull ZoomLevelFeature zoomLevel) { * * @param fps the {@link IntFeature} instance to set. */ - public void setFps(IntFeature fps) { + public void setFps(@NonNull IntFeature fps) { this.featureMap.put(FPS, fps); } @@ -316,6 +316,7 @@ public void setFps(IntFeature fps) { * * @return the fps feature. */ + @NonNull public IntFeature getFps() { return (IntFeature) featureMap.get(FPS); } @@ -325,7 +326,7 @@ public IntFeature getFps() { * * @param videoBitrate the {@link IntFeature} instance to set. */ - public void setVideoBitrate(IntFeature videoBitrate) { + public void setVideoBitrate(@NonNull IntFeature videoBitrate) { this.featureMap.put(VIDEO_BITRATE, videoBitrate); } @@ -334,6 +335,7 @@ public void setVideoBitrate(IntFeature videoBitrate) { * * @return the videoBitrate feature. */ + @NonNull public IntFeature getVideoBitrate() { return (IntFeature) featureMap.get(VIDEO_BITRATE); } @@ -343,7 +345,7 @@ public IntFeature getVideoBitrate() { * * @param getAudioBitrate the {@link IntFeature} instance to set. */ - public void setAudioBitrate(IntFeature audioBitrate) { + public void setAudioBitrate(@NonNull IntFeature audioBitrate) { this.featureMap.put(AUDIO_BITRATE, audioBitrate); } @@ -352,6 +354,7 @@ public void setAudioBitrate(IntFeature audioBitrate) { * * @return the getAudioBitrate feature. */ + @NonNull public IntFeature getAudioBitrate() { return (IntFeature) featureMap.get(AUDIO_BITRATE); } From a29b222ae068682ccb6d44edb2b4f110a368789f Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 15:48:45 +0300 Subject: [PATCH 040/108] IntFeature NonNull --- .../plugins/camera/features/intfeature/IntFeature.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java index 4317b2ddfe6..7e927328ed4 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java @@ -16,13 +16,14 @@ */ public class IntFeature extends CameraFeature { - private Integer currentValue; + @NonNull private Integer currentValue; - public IntFeature(CameraProperties cameraProperties, Integer value) { + public IntFeature(@NonNull CameraProperties cameraProperties, @NonNull Integer value) { super(cameraProperties); currentValue = value; } + @NonNull @Override public String getDebugName() { return "IntFeature"; @@ -36,7 +37,7 @@ public Integer getValue() { } @Override - public void setValue(Integer value) { + public void setValue(@NonNull Integer value) { currentValue = value; } @@ -46,5 +47,5 @@ public boolean checkIsSupported() { } @Override - public void updateBuilder(CaptureRequest.Builder requestBuilder) {} + public void updateBuilder(@NonNull CaptureRequest.Builder requestBuilder) {} } From 1020ee7302276163b8a37b079ca3be8c313a6a61 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 15:55:15 +0300 Subject: [PATCH 041/108] import NonNull --- .../flutter/plugins/camera/features/intfeature/IntFeature.java | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java index 7e927328ed4..4df713608e9 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java @@ -6,6 +6,7 @@ import android.annotation.SuppressLint; import android.hardware.camera2.CaptureRequest; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import io.flutter.plugins.camera.CameraProperties; import io.flutter.plugins.camera.features.CameraFeature; From c31a502bb067eaec1ef7826b2976fc215c299b01 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 16:05:48 +0300 Subject: [PATCH 042/108] NonNull --- .../camera/media/MediaRecorderBuilder.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java index 64b0d89fba5..f7a9546b089 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java @@ -33,9 +33,9 @@ MediaRecorder makeMediaRecorder() { public MediaRecorderBuilder( @NonNull CamcorderProfile camcorderProfile, @NonNull String outputFilePath, - Integer fps, - Integer videoBitrate, - Integer audioBitrate) { + @NonNull Integer fps, + @NonNull Integer videoBitrate, + @NonNull Integer audioBitrate) { this( camcorderProfile, outputFilePath, @@ -48,9 +48,9 @@ public MediaRecorderBuilder( public MediaRecorderBuilder( @NonNull EncoderProfiles encoderProfiles, @NonNull String outputFilePath, - Integer fps, - Integer videoBitrate, - Integer audioBitrate) { + @NonNull Integer fps, + @NonNull Integer videoBitrate, + @NonNull Integer audioBitrate) { this( encoderProfiles, outputFilePath, @@ -64,9 +64,9 @@ public MediaRecorderBuilder( @NonNull CamcorderProfile camcorderProfile, @NonNull String outputFilePath, MediaRecorderFactory helper, - Integer fps, - Integer videoBitrate, - Integer audioBitrate) { + @NonNull Integer fps, + @NonNull Integer videoBitrate, + @NonNull Integer audioBitrate) { this.outputFilePath = outputFilePath; this.camcorderProfile = camcorderProfile; this.encoderProfiles = null; @@ -80,9 +80,9 @@ public MediaRecorderBuilder( @NonNull EncoderProfiles encoderProfiles, @NonNull String outputFilePath, MediaRecorderFactory helper, - Integer fps, - Integer videoBitrate, - Integer audioBitrate) { + @NonNull Integer fps, + @NonNull Integer videoBitrate, + @NonNull Integer audioBitrate) { this.outputFilePath = outputFilePath; this.encoderProfiles = encoderProfiles; this.camcorderProfile = null; From d185de2ee3c38359c156da858e7bb895c1041811 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 16:48:36 +0300 Subject: [PATCH 043/108] Update CHANGELOG and Version --- packages/camera/camera/CHANGELOG.md | 4 ++++ packages/camera/camera/pubspec.yaml | 2 +- packages/camera/camera_android/CHANGELOG.md | 3 ++- packages/camera/camera_android/pubspec.yaml | 2 +- packages/camera/camera_android_camerax/CHANGELOG.md | 4 ++++ packages/camera/camera_android_camerax/pubspec.yaml | 2 +- packages/camera/camera_avfoundation/CHANGELOG.md | 2 +- packages/camera/camera_avfoundation/pubspec.yaml | 2 +- packages/camera/camera_platform_interface/CHANGELOG.md | 2 +- packages/camera/camera_platform_interface/pubspec.yaml | 2 +- packages/camera/camera_web/CHANGELOG.md | 2 +- packages/camera/camera_web/pubspec.yaml | 2 +- packages/camera/camera_windows/CHANGELOG.md | 2 +- packages/camera/camera_windows/pubspec.yaml | 2 +- 14 files changed, 21 insertions(+), 12 deletions(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index 7f0d3d671c6..bd84dc36958 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.5+3 + +* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. + ## 0.10.5+2 * Fixes unawaited_futures violations. diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index 7da65cc7c58..8d0bfe88db0 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -4,7 +4,7 @@ description: A Flutter plugin for controlling the camera. Supports previewing Dart. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.10.5+2 +version: 0.10.5+3 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index 6004bad0ecb..53e094be74c 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.10.8+3 +* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. * Fixes unawaited_futures violations. ## 0.10.8+2 diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 26616027f7d..e320e13829f 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" diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 0bf190fdddc..34ccb9e8ceb 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.0+6 + +* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. + ## 0.5.0+5 * Updates `README.md` to fully cover unimplemented functionality. diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index fdb3dad0ea3..279dc17ee27 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -3,7 +3,7 @@ description: Android implementation of the camera plugin using the CameraX libra 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.5.0+5 +version: 0.5.0+6 environment: sdk: ">=2.19.0 <4.0.0" diff --git a/packages/camera/camera_avfoundation/CHANGELOG.md b/packages/camera/camera_avfoundation/CHANGELOG.md index 0794136836f..f5d2ab88179 100644 --- a/packages/camera/camera_avfoundation/CHANGELOG.md +++ b/packages/camera/camera_avfoundation/CHANGELOG.md @@ -1,4 +1,4 @@ -## NEXT +## 0.9.13+3 * CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. * Fixes unawaited_futures violations. diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index 782104b4f73..56d2e215839 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_avfoundation description: iOS implementation of the camera plugin. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_avfoundation issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.9.13+2 +version: 0.9.13+3 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index 84f2c2db8fc..8421e48b80f 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,4 +1,4 @@ -## NEXT +## 2.6.1 * CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index cbb7a401ad3..0dca74022f0 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.6.0 +version: 2.6.1 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/camera/camera_web/CHANGELOG.md b/packages/camera/camera_web/CHANGELOG.md index 16529759063..af1a5208d7c 100644 --- a/packages/camera/camera_web/CHANGELOG.md +++ b/packages/camera/camera_web/CHANGELOG.md @@ -1,4 +1,4 @@ -## NEXT +## 0.3.1+5 * CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 2a98cb2777a..58293cad0bf 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_web description: A Flutter plugin for getting information about and controlling the camera on Web. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.3.1+4 +version: 0.3.1+5 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/camera/camera_windows/CHANGELOG.md b/packages/camera/camera_windows/CHANGELOG.md index 0f6d0750ab8..e52d3c8c633 100644 --- a/packages/camera/camera_windows/CHANGELOG.md +++ b/packages/camera/camera_windows/CHANGELOG.md @@ -1,4 +1,4 @@ -## NEXT +## 0.2.1+8 * CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index f68a1e79c8b..5790f90d97b 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_windows description: A Flutter plugin for getting information about and controlling the camera on Windows. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_windows issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.2.1+7 +version: 0.2.1+8 environment: sdk: ">=2.18.0 <4.0.0" From a1fe1349b5fafea356f39de6a5d771320262e6c3 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 16:55:23 +0300 Subject: [PATCH 044/108] interface version --- packages/camera/camera_platform_interface/CHANGELOG.md | 3 +-- packages/camera/camera_platform_interface/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index 8421e48b80f..ac999b07550 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,10 +1,9 @@ -## 2.6.1 +## 2.6.0 * CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. ## 2.5.1 -* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. * Removes obsolete null checks on non-nullable values. * Updates minimum supported SDK version to Flutter 3.3/Dart 2.18. diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 0dca74022f0..cbb7a401ad3 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.6.1 +version: 2.6.0 environment: sdk: ">=2.18.0 <4.0.0" From 58aa61d44d0949fcd9434d727bfac365fe688053 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 19:01:36 +0300 Subject: [PATCH 045/108] flutter_plugin_tools.dart make-deps-path-based --- packages/camera/camera/example/pubspec.yaml | 6 ++++++ packages/camera/camera/pubspec.yaml | 4 ++++ packages/camera/camera_android/example/pubspec.yaml | 4 ++++ packages/camera/camera_android/pubspec.yaml | 4 ++++ packages/camera/camera_android_camerax/example/pubspec.yaml | 4 ++++ packages/camera/camera_android_camerax/pubspec.yaml | 4 ++++ packages/camera/camera_avfoundation/example/pubspec.yaml | 4 ++++ packages/camera/camera_avfoundation/pubspec.yaml | 4 ++++ packages/camera/camera_web/example/pubspec.yaml | 4 ++++ packages/camera/camera_web/pubspec.yaml | 4 ++++ packages/camera/camera_windows/example/pubspec.yaml | 4 ++++ packages/camera/camera_windows/pubspec.yaml | 4 ++++ 12 files changed, 50 insertions(+) diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index 009f2e508a8..c3083cf0ee0 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -22,9 +22,15 @@ dependencies: video_player: ^2.1.4 +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: + + camera: + path: ../../../camera/camera camera_android: path: ../../../camera/camera_android camera_avfoundation: diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index 8d0bfe88db0..cb037d75f72 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -40,5 +40,9 @@ dev_dependencies: video_player: ^2.0.0 # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: + {camera_android: {path: ../../camera/camera_android}, camera_avfoundation: {path: ../../camera/camera_avfoundation}, camera_platform_interface: {path: ../../camera/camera_platform_interface}, camera_web: {path: ../../camera/camera_web}} diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index 3a65a470951..c43eb797aea 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -22,9 +22,13 @@ dependencies: video_player: ^2.1.4 +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: + camera_android: path: ../../../camera/camera_android camera_platform_interface: diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index e320e13829f..d47925cb720 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -33,5 +33,9 @@ dev_dependencies: sdk: flutter # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: + {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index ff9750bf715..3928ed72603 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -20,9 +20,13 @@ dependencies: video_player: ^2.4.10 +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: + camera_android_camerax: path: ../../../camera/camera_android_camerax camera_platform_interface: diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 279dc17ee27..02bb80d9950 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -36,5 +36,9 @@ dev_dependencies: pigeon: ^9.1.0 # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: + {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index 67910d9f7ac..fe98c45e49f 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -22,10 +22,14 @@ dependencies: video_player: ^2.1.4 +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: + camera_avfoundation: path: ../../../camera/camera_avfoundation camera_platform_interface: diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index 56d2e215839..189790a4068 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -30,5 +30,9 @@ dev_dependencies: sdk: flutter # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: + {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index 092a616e666..06381fda8e5 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -10,9 +10,13 @@ dependencies: sdk: flutter +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: + camera_platform_interface: path: ../../../camera/camera_platform_interface camera_web: diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 58293cad0bf..043e8713696 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -29,5 +29,9 @@ dev_dependencies: sdk: flutter # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: + {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_windows/example/pubspec.yaml b/packages/camera/camera_windows/example/pubspec.yaml index 3a4687bfcb5..188d2af9b6c 100644 --- a/packages/camera/camera_windows/example/pubspec.yaml +++ b/packages/camera/camera_windows/example/pubspec.yaml @@ -19,9 +19,13 @@ dependencies: sdk: flutter +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: + camera_platform_interface: path: ../../../camera/camera_platform_interface camera_windows: diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index 5790f90d97b..95b4cc6017c 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -29,5 +29,9 @@ dev_dependencies: sdk: flutter # See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: + {camera_platform_interface: {path: ../../camera/camera_platform_interface}} From ecae539d15a4f0e551de911e1f1cf3e85d6fd6d2 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 19:25:07 +0300 Subject: [PATCH 046/108] temporary publish_to: none --- packages/camera/camera/pubspec.yaml | 1 + packages/camera/camera_android/pubspec.yaml | 2 +- packages/camera/camera_android_camerax/pubspec.yaml | 2 +- packages/camera/camera_avfoundation/pubspec.yaml | 1 + packages/camera/camera_platform_interface/pubspec.yaml | 1 + packages/camera/camera_web/pubspec.yaml | 1 + packages/camera/camera_windows/pubspec.yaml | 1 + 7 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index cb037d75f72..7144b40085e 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -4,6 +4,7 @@ description: A Flutter plugin for controlling the camera. Supports previewing Dart. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 +publish_to: none version: 0.10.5+3 environment: diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index d47925cb720..eb317eb6ce8 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android 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 - +publish_to: none version: 0.10.8+3 environment: diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 02bb80d9950..466645f5406 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 - +publish_to: none version: 0.5.0+6 environment: diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index 189790a4068..c9d5d5abc68 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -2,6 +2,7 @@ name: camera_avfoundation description: iOS implementation of the camera plugin. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_avfoundation issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 +publish_to: none version: 0.9.13+3 environment: diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index cbb7a401ad3..56707cc75be 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,6 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes +publish_to: none version: 2.6.0 environment: diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 043e8713696..007e4c43bec 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -2,6 +2,7 @@ name: camera_web description: A Flutter plugin for getting information about and controlling the camera on Web. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 +publish_to: none version: 0.3.1+5 environment: diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index 95b4cc6017c..0906f9e6846 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -2,6 +2,7 @@ name: camera_windows description: A Flutter plugin for getting information about and controlling the camera on Windows. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_windows issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 +publish_to: none version: 0.2.1+8 environment: From 2eb06576bf55e2bfd5843f75198d4d0bf440fc01 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 19:54:41 +0300 Subject: [PATCH 047/108] temporary deps change: avoid The following unexpected non-local dependencies were found error --- packages/camera/camera/example/pubspec.yaml | 25 ------------------- packages/camera/camera/pubspec.yaml | 21 +++++++--------- .../camera_android/example/pubspec.yaml | 21 ++-------------- packages/camera/camera_android/pubspec.yaml | 10 ++------ .../example/pubspec.yaml | 21 ++-------------- .../camera_android_camerax/pubspec.yaml | 12 +++------ .../camera_avfoundation/example/pubspec.yaml | 22 ++-------------- .../camera/camera_avfoundation/pubspec.yaml | 11 ++------ .../camera/camera_web/example/pubspec.yaml | 15 +++-------- packages/camera/camera_web/pubspec.yaml | 12 +++------ .../camera_windows/example/pubspec.yaml | 22 +++------------- packages/camera/camera_windows/pubspec.yaml | 12 +++------ 12 files changed, 34 insertions(+), 170 deletions(-) diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index c3083cf0ee0..f6b308f7585 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -8,11 +8,6 @@ environment: dependencies: camera: - # When depending on this package from a real application you should use: - # camera: ^x.y.z - # See https://dart.dev/tools/pub/dependencies#version-constraints - # The example app is bundled with the plugin so we use a path dependency on - # the parent directory to use the current plugin's version. path: ../ camera_platform_interface: path: ../../camera_platform_interface @@ -21,26 +16,6 @@ dependencies: path_provider: ^2.0.0 video_player: ^2.1.4 - -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - - - camera: - path: ../../../camera/camera - camera_android: - path: ../../../camera/camera_android - camera_avfoundation: - path: ../../../camera/camera_avfoundation - camera_platform_interface: - path: ../../../camera/camera_platform_interface - camera_web: - path: ../../../camera/camera_web - - dev_dependencies: build_runner: ^2.1.10 flutter_driver: diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index 7144b40085e..c7df62d022b 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -22,10 +22,15 @@ flutter: default_package: camera_web dependencies: - camera_android: ^0.10.7 - camera_avfoundation: ^0.9.13 - camera_platform_interface: ^2.5.0 - camera_web: ^0.3.1 + camera_android: + path: ../../camera/camera_android + camera_avfoundation: + path: ../../camera/camera_avfoundation + camera_platform_interface: + path: ../../camera/camera_platform_interface + camera_web: + path: ../../camera/camera_web + flutter: sdk: flutter flutter_plugin_android_lifecycle: ^2.0.2 @@ -39,11 +44,3 @@ dev_dependencies: mockito: 5.4.1 plugin_platform_interface: ^2.0.0 video_player: ^2.0.0 - -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - - {camera_android: {path: ../../camera/camera_android}, camera_avfoundation: {path: ../../camera/camera_avfoundation}, camera_platform_interface: {path: ../../camera/camera_platform_interface}, camera_web: {path: ../../camera/camera_web}} diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index c43eb797aea..356dca297c2 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -8,32 +8,15 @@ environment: dependencies: camera_android: - # When depending on this package from a real application you should use: - # camera_android: ^x.y.z - # See https://dart.dev/tools/pub/dependencies#version-constraints - # The example app is bundled with the plugin so we use a path dependency on - # the parent directory to use the current plugin's version. path: ../ - camera_platform_interface: ^2.5.0 + camera_platform_interface: + path: ../../../camera/camera_platform_interface flutter: sdk: flutter path_provider: ^2.0.0 quiver: ^3.0.0 video_player: ^2.1.4 - -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - - - camera_android: - path: ../../../camera/camera_android - camera_platform_interface: - path: ../../../camera/camera_platform_interface - dev_dependencies: build_runner: ^2.1.10 flutter_driver: diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index eb317eb6ce8..7cdaacf213d 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -19,7 +19,8 @@ flutter: dartPluginClass: AndroidCamera dependencies: - camera_platform_interface: ^2.5.0 + camera_platform_interface: + path: ../../camera/camera_platform_interface flutter: sdk: flutter flutter_plugin_android_lifecycle: ^2.0.2 @@ -32,10 +33,3 @@ dev_dependencies: flutter_test: sdk: flutter -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - - {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index 3928ed72603..e6a56e3ddc0 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -8,30 +8,13 @@ environment: dependencies: camera_android_camerax: - # When depending on this package from a real application you should use: - # camera_android_camerax: ^x.y.z - # See https://dart.dev/tools/pub/dependencies#version-constraints - # The example app is bundled with the plugin so we use a path dependency on - # the parent directory to use the current plugin's version. path: ../ - camera_platform_interface: ^2.2.0 + camera_platform_interface: + path: ../../../camera/camera_platform_interface flutter: sdk: flutter video_player: ^2.4.10 - -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - - - camera_android_camerax: - path: ../../../camera/camera_android_camerax - camera_platform_interface: - path: ../../../camera/camera_platform_interface - dev_dependencies: espresso: ^0.2.0 flutter_test: diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 466645f5406..91453823662 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -20,7 +20,9 @@ flutter: dependencies: async: ^2.5.0 - camera_platform_interface: ^2.2.0 + camera_platform_interface: + path: ../../camera/camera_platform_interface + flutter: sdk: flutter integration_test: @@ -34,11 +36,3 @@ dev_dependencies: sdk: flutter mockito: 5.4.1 pigeon: ^9.1.0 - -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - - {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index fe98c45e49f..8d49ca4a9b7 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -8,33 +8,15 @@ environment: dependencies: camera_avfoundation: - # When depending on this package from a real application you should use: - # camera_avfoundation: ^x.y.z - # See https://dart.dev/tools/pub/dependencies#version-constraints - # The example app is bundled with the plugin so we use a path dependency on - # the parent directory to use the current plugin's version. path: ../ - camera_platform_interface: ^2.4.0 + camera_platform_interface: + path: ../../../camera/camera_platform_interface flutter: sdk: flutter path_provider: ^2.0.0 quiver: ^3.0.0 video_player: ^2.1.4 - -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - - - - camera_avfoundation: - path: ../../../camera/camera_avfoundation - camera_platform_interface: - path: ../../../camera/camera_platform_interface - dev_dependencies: build_runner: ^2.1.10 flutter_driver: diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index c9d5d5abc68..f673eefa3c1 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -18,7 +18,8 @@ flutter: dartPluginClass: AVFoundationCamera dependencies: - camera_platform_interface: ^2.4.0 + camera_platform_interface: + path: ../../camera/camera_platform_interface flutter: sdk: flutter stream_transform: ^2.0.0 @@ -29,11 +30,3 @@ dev_dependencies: sdk: flutter flutter_test: sdk: flutter - -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - - {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index 06381fda8e5..1b7248d5b3b 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -9,23 +9,14 @@ dependencies: flutter: sdk: flutter + camera_web: + path: ../ -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - - - camera_platform_interface: + camera_platform_interface: path: ../../../camera/camera_platform_interface - camera_web: - path: ../../../camera/camera_web dev_dependencies: async: ^2.5.0 - camera_platform_interface: - camera_web: cross_file: ^0.3.1 flutter_driver: sdk: flutter diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 007e4c43bec..22e9ec3faac 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -18,7 +18,9 @@ flutter: fileName: camera_web.dart dependencies: - camera_platform_interface: ^2.3.1 + camera_platform_interface: + path: ../../camera/camera_platform_interface + flutter: sdk: flutter flutter_web_plugins: @@ -28,11 +30,3 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - - {camera_platform_interface: {path: ../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_windows/example/pubspec.yaml b/packages/camera/camera_windows/example/pubspec.yaml index 188d2af9b6c..e0698e03a49 100644 --- a/packages/camera/camera_windows/example/pubspec.yaml +++ b/packages/camera/camera_windows/example/pubspec.yaml @@ -7,30 +7,14 @@ environment: flutter: ">=3.3.0" dependencies: - camera_platform_interface: ^2.1.2 + camera_platform_interface: + path: ../../../camera/camera_platform_interface + camera_windows: - # When depending on this package from a real application you should use: - # camera_windows: ^x.y.z - # See https://dart.dev/tools/pub/dependencies#version-constraints - # The example app is bundled with the plugin so we use a path dependency on - # the parent directory to use the current plugin's version. path: ../ flutter: sdk: flutter - -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - - - camera_platform_interface: - path: ../../../camera/camera_platform_interface - camera_windows: - path: ../../../camera/camera_windows - dev_dependencies: async: ^2.5.0 flutter_test: diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index 0906f9e6846..ccd16e79dd6 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -18,7 +18,9 @@ flutter: dartPluginClass: CameraWindows dependencies: - camera_platform_interface: ^2.3.1 + camera_platform_interface: + path: ../../camera/camera_platform_interface + cross_file: ^0.3.1 flutter: sdk: flutter @@ -28,11 +30,3 @@ dev_dependencies: async: ^2.5.0 flutter_test: sdk: flutter - -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - - {camera_platform_interface: {path: ../../camera/camera_platform_interface}} From a3f9c1d10367764f967a26764544f80018aa4de5 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 20:07:56 +0300 Subject: [PATCH 048/108] deps order --- packages/camera/camera_web/example/pubspec.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index 1b7248d5b3b..a5cb6a9c9fb 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -6,14 +6,14 @@ environment: flutter: ">=3.3.0" dependencies: - flutter: - sdk: flutter + camera_platform_interface: + path: ../../../camera/camera_platform_interface camera_web: path: ../ - camera_platform_interface: - path: ../../../camera/camera_platform_interface + flutter: + sdk: flutter dev_dependencies: async: ^2.5.0 From 076110f9beb88f33515e3b3e4ace71b669be9a4b Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 20:17:09 +0300 Subject: [PATCH 049/108] mistype --- packages/camera/camera/CHANGELOG.md | 2 +- packages/camera/camera_android/CHANGELOG.md | 4 ++-- packages/camera/camera_android_camerax/CHANGELOG.md | 2 +- packages/camera/camera_avfoundation/CHANGELOG.md | 2 +- packages/camera/camera_platform_interface/CHANGELOG.md | 2 +- packages/camera/camera_web/CHANGELOG.md | 2 +- packages/camera/camera_windows/CHANGELOG.md | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index bd84dc36958..345844ece0e 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.10.5+3 -* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. +* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. ## 0.10.5+2 diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index 53e094be74c..548b0889b09 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.10.8+3 -* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. +* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. * Fixes unawaited_futures violations. ## 0.10.8+2 @@ -28,7 +28,7 @@ ## 0.10.6+1 * Adds a namespace for compatibility with AGP 8.0. -* Adds `CameraPlatfrom.createCameraWithSettings` to allow recorded video fps and bitrate control. +* Adds `CameraPlatform.createCameraWithSettings` to allow recorded video fps and bitrate control. * Bump: `com.android.tools.build:gradle:7.2.0` ## 0.10.6 diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 34ccb9e8ceb..ddcde933f9f 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.5.0+6 -* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. +* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. ## 0.5.0+5 diff --git a/packages/camera/camera_avfoundation/CHANGELOG.md b/packages/camera/camera_avfoundation/CHANGELOG.md index f5d2ab88179..c852af22d73 100644 --- a/packages/camera/camera_avfoundation/CHANGELOG.md +++ b/packages/camera/camera_avfoundation/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.9.13+3 -* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. +* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. * Fixes unawaited_futures violations. ## 0.9.13+2 diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index ac999b07550..7e05395cb32 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,6 +1,6 @@ ## 2.6.0 -* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. +* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. ## 2.5.1 diff --git a/packages/camera/camera_web/CHANGELOG.md b/packages/camera/camera_web/CHANGELOG.md index af1a5208d7c..5b1b297bb1f 100644 --- a/packages/camera/camera_web/CHANGELOG.md +++ b/packages/camera/camera_web/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.3.1+5 -* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. +* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. ## 0.3.1+4 diff --git a/packages/camera/camera_windows/CHANGELOG.md b/packages/camera/camera_windows/CHANGELOG.md index e52d3c8c633..6ebe962d3dd 100644 --- a/packages/camera/camera_windows/CHANGELOG.md +++ b/packages/camera/camera_windows/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.2.1+8 -* CameraPlatfrom.createCameraWithSettings to allow recorded video fps and bitrate control. +* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. ## 0.2.1+7 From ce0551847c355771f4ffd38ec439083a2eb98a47 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 20:55:16 +0300 Subject: [PATCH 050/108] args package changed. --- script/tool/test/update_min_sdk_command_test.dart | 2 +- script/tool/test/update_release_info_command_test.dart | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/script/tool/test/update_min_sdk_command_test.dart b/script/tool/test/update_min_sdk_command_test.dart index 91387489f35..5873aa04c03 100644 --- a/script/tool/test/update_min_sdk_command_test.dart +++ b/script/tool/test/update_min_sdk_command_test.dart @@ -35,7 +35,7 @@ void main() { commandError = e; }); - expect(commandError, isA()); + expect(commandError, isA()); }); test('updates Dart when only Dart is present', () async { diff --git a/script/tool/test/update_release_info_command_test.dart b/script/tool/test/update_release_info_command_test.dart index 0981a85f62e..fc386b90795 100644 --- a/script/tool/test/update_release_info_command_test.dart +++ b/script/tool/test/update_release_info_command_test.dart @@ -58,7 +58,7 @@ void main() { commandError = e; }); - expect(commandError, isA()); + expect(commandError, isA()); }); test('fails if --changelog is blank', () async { @@ -72,7 +72,7 @@ void main() { commandError = e; }); - expect(commandError, isA()); + expect(commandError, isA()); }); test('fails if --version is missing', () async { @@ -83,7 +83,7 @@ void main() { commandError = e; }); - expect(commandError, isA()); + expect(commandError, isA()); }); test('fails if --version is an unknown value', () async { @@ -97,7 +97,7 @@ void main() { commandError = e; }); - expect(commandError, isA()); + expect(commandError, isA()); }); }); From 618a432a07e62d6e28b783239bdf1d39b036336e Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 21:09:59 +0300 Subject: [PATCH 051/108] args changed: errorHandler --- .../tool/test/update_min_sdk_command_test.dart | 4 ++-- .../test/update_release_info_command_test.dart | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/script/tool/test/update_min_sdk_command_test.dart b/script/tool/test/update_min_sdk_command_test.dart index 5873aa04c03..8334ebb540b 100644 --- a/script/tool/test/update_min_sdk_command_test.dart +++ b/script/tool/test/update_min_sdk_command_test.dart @@ -28,10 +28,10 @@ void main() { }); test('fails if --flutter-min is missing', () async { - Exception? commandError; + Error? commandError; await runCapturingPrint(runner, [ 'update-min-sdk', - ], exceptionHandler: (Exception e) { + ], errorHandler: (Error e) { commandError = e; }); diff --git a/script/tool/test/update_release_info_command_test.dart b/script/tool/test/update_release_info_command_test.dart index fc386b90795..5b9914fa419 100644 --- a/script/tool/test/update_release_info_command_test.dart +++ b/script/tool/test/update_release_info_command_test.dart @@ -50,11 +50,11 @@ void main() { group('flags', () { test('fails if --changelog is missing', () async { - Exception? commandError; + Error? commandError; await runCapturingPrint(runner, [ 'update-release-info', '--version=next', - ], exceptionHandler: (Exception e) { + ], errorHandler: (Error e) { commandError = e; }); @@ -62,13 +62,13 @@ void main() { }); test('fails if --changelog is blank', () async { - Exception? commandError; + Error? commandError; await runCapturingPrint(runner, [ 'update-release-info', '--version=next', '--changelog', '', - ], exceptionHandler: (Exception e) { + ], errorHandler: (Error e) { commandError = e; }); @@ -76,10 +76,10 @@ void main() { }); test('fails if --version is missing', () async { - Exception? commandError; + Error? commandError; await runCapturingPrint( runner, ['update-release-info', '--changelog', ''], - exceptionHandler: (Exception e) { + errorHandler: (Error e) { commandError = e; }); @@ -87,13 +87,13 @@ void main() { }); test('fails if --version is an unknown value', () async { - Exception? commandError; + Error? commandError; await runCapturingPrint(runner, [ 'update-release-info', '--version=foo', '--changelog', '', - ], exceptionHandler: (Exception e) { + ], errorHandler: (Error e) { commandError = e; }); From e81dfeedc42e64d746360f8d4e6c8093abb67a0b Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 21:30:17 +0300 Subject: [PATCH 052/108] args updated --- script/tool/pubspec.yaml | 2 +- .../test/update_release_info_command_test.dart | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/script/tool/pubspec.yaml b/script/tool/pubspec.yaml index 0926fe48616..f4828685ab2 100644 --- a/script/tool/pubspec.yaml +++ b/script/tool/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/script/tool version: 0.13.4+4 dependencies: - args: ^2.1.0 + args: ^2.4.2 async: ^2.6.1 collection: ^1.15.0 colorize: ^3.0.0 diff --git a/script/tool/test/update_release_info_command_test.dart b/script/tool/test/update_release_info_command_test.dart index 5b9914fa419..9f23ff3c601 100644 --- a/script/tool/test/update_release_info_command_test.dart +++ b/script/tool/test/update_release_info_command_test.dart @@ -62,42 +62,42 @@ void main() { }); test('fails if --changelog is blank', () async { - Error? commandError; + Exception? commandError; await runCapturingPrint(runner, [ 'update-release-info', '--version=next', '--changelog', '', - ], errorHandler: (Error e) { + ], exceptionHandler: (Exception e) { commandError = e; }); - expect(commandError, isA()); + expect(commandError, isA()); }); test('fails if --version is missing', () async { - Error? commandError; + Exception? commandError; await runCapturingPrint( runner, ['update-release-info', '--changelog', ''], - errorHandler: (Error e) { + exceptionHandler: (Exception e) { commandError = e; }); - expect(commandError, isA()); + expect(commandError, isA()); }); test('fails if --version is an unknown value', () async { - Error? commandError; + Exception? commandError; await runCapturingPrint(runner, [ 'update-release-info', '--version=foo', '--changelog', '', - ], errorHandler: (Error e) { + ], exceptionHandler: (Exception e) { commandError = e; }); - expect(commandError, isA()); + expect(commandError, isA()); }); }); From c95b6d5c007aea821479672b97e60faed583a849 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 22:10:40 +0300 Subject: [PATCH 053/108] bump dart version --- script/tool/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/tool/pubspec.yaml b/script/tool/pubspec.yaml index f4828685ab2..654dee20858 100644 --- a/script/tool/pubspec.yaml +++ b/script/tool/pubspec.yaml @@ -30,4 +30,4 @@ dev_dependencies: mockito: '>=5.3.2 <=5.4.0' environment: - sdk: '>=2.14.0 <4.0.0' + sdk: ">=2.19.0 <4.0.0" From e392d1d918e04df3781e678d60e222548bb70432 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 22:13:40 +0300 Subject: [PATCH 054/108] args: ^2.3.2 --- script/tool/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/tool/pubspec.yaml b/script/tool/pubspec.yaml index 654dee20858..4493fa712d5 100644 --- a/script/tool/pubspec.yaml +++ b/script/tool/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/script/tool version: 0.13.4+4 dependencies: - args: ^2.4.2 + args: ^2.3.2 async: ^2.6.1 collection: ^1.15.0 colorize: ^3.0.0 @@ -30,4 +30,4 @@ dev_dependencies: mockito: '>=5.3.2 <=5.4.0' environment: - sdk: ">=2.19.0 <4.0.0" + sdk: '>=2.14.0 <4.0.0' From 72233fc13652d6354cf4f07798914e6cb0802ec4 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 22:43:16 +0300 Subject: [PATCH 055/108] workaround args version --- .../test/update_min_sdk_command_test.dart | 8 ++- .../update_release_info_command_test.dart | 50 ++++++++++++++----- 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/script/tool/test/update_min_sdk_command_test.dart b/script/tool/test/update_min_sdk_command_test.dart index 8334ebb540b..bd1a2cb3699 100644 --- a/script/tool/test/update_min_sdk_command_test.dart +++ b/script/tool/test/update_min_sdk_command_test.dart @@ -29,13 +29,19 @@ void main() { test('fails if --flutter-min is missing', () async { Error? commandError; + Exception? commandException; await runCapturingPrint(runner, [ 'update-min-sdk', ], errorHandler: (Error e) { commandError = e; + }, exceptionHandler: (Exception e) { + commandException = e; }); - expect(commandError, isA()); + expect( + commandError is ArgumentError || commandException is UsageException, + isTrue, + ); }); test('updates Dart when only Dart is present', () async { diff --git a/script/tool/test/update_release_info_command_test.dart b/script/tool/test/update_release_info_command_test.dart index 9f23ff3c601..fd743427355 100644 --- a/script/tool/test/update_release_info_command_test.dart +++ b/script/tool/test/update_release_info_command_test.dart @@ -51,53 +51,79 @@ void main() { group('flags', () { test('fails if --changelog is missing', () async { Error? commandError; + Exception? commandException; await runCapturingPrint(runner, [ 'update-release-info', '--version=next', ], errorHandler: (Error e) { commandError = e; + }, exceptionHandler: (Exception e) { + commandException = e; }); - expect(commandError, isA()); + expect( + commandError is ArgumentError || commandException is UsageException, + isTrue, + ); }); test('fails if --changelog is blank', () async { - Exception? commandError; + Error? commandError; + Exception? commandException; await runCapturingPrint(runner, [ 'update-release-info', '--version=next', '--changelog', '', - ], exceptionHandler: (Exception e) { + ], errorHandler: (Error e) { commandError = e; + }, exceptionHandler: (Exception e) { + commandException = e; }); - expect(commandError, isA()); + expect( + commandError is ArgumentError || commandException is UsageException, + isTrue, + ); }); test('fails if --version is missing', () async { - Exception? commandError; - await runCapturingPrint( - runner, ['update-release-info', '--changelog', ''], - exceptionHandler: (Exception e) { + Error? commandError; + Exception? commandException; + await runCapturingPrint(runner, [ + 'update-release-info', + '--changelog', + '', + ], errorHandler: (Error e) { commandError = e; + }, exceptionHandler: (Exception e) { + commandException = e; }); - expect(commandError, isA()); + expect( + commandError is ArgumentError || commandException is UsageException, + isTrue, + ); }); test('fails if --version is an unknown value', () async { - Exception? commandError; + Error? commandError; + Exception? commandException; await runCapturingPrint(runner, [ 'update-release-info', '--version=foo', '--changelog', '', - ], exceptionHandler: (Exception e) { + ], errorHandler: (Error e) { commandError = e; + }, exceptionHandler: (Exception e) { + commandException = e; }); - expect(commandError, isA()); + expect( + commandError is ArgumentError || commandException is UsageException, + isTrue, + ); }); }); From 0a81ffe08ce8d81327e76e187a9a69a9d427818e Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 5 Jun 2023 22:56:49 +0300 Subject: [PATCH 056/108] workaround args version --- script/tool/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/tool/pubspec.yaml b/script/tool/pubspec.yaml index 4493fa712d5..0926fe48616 100644 --- a/script/tool/pubspec.yaml +++ b/script/tool/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/script/tool version: 0.13.4+4 dependencies: - args: ^2.3.2 + args: ^2.1.0 async: ^2.6.1 collection: ^1.15.0 colorize: ^3.0.0 From dfe7b5aae31fb629821ddf6a2640d92b0b87c8d3 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 6 Jun 2023 11:30:56 +0300 Subject: [PATCH 057/108] dependency overrides --- packages/camera/camera/pubspec.yaml | 15 +++++++++++---- packages/camera/camera_android/pubspec.yaml | 5 ++++- .../camera/camera_android_camerax/pubspec.yaml | 6 +++++- packages/camera/camera_avfoundation/pubspec.yaml | 7 ++++++- packages/camera/camera_web/pubspec.yaml | 6 +++++- packages/camera/camera_windows/pubspec.yaml | 6 +++++- 6 files changed, 36 insertions(+), 9 deletions(-) diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index c7df62d022b..748b7b77090 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -23,13 +23,9 @@ flutter: dependencies: camera_android: - path: ../../camera/camera_android camera_avfoundation: - path: ../../camera/camera_avfoundation camera_platform_interface: - path: ../../camera/camera_platform_interface camera_web: - path: ../../camera/camera_web flutter: sdk: flutter @@ -44,3 +40,14 @@ dev_dependencies: mockito: 5.4.1 plugin_platform_interface: ^2.0.0 video_player: ^2.0.0 + +# TODO: for PR +dependency_overrides: + camera_android: + path: ../../camera/camera_android + camera_avfoundation: + path: ../../camera/camera_avfoundation + camera_platform_interface: + path: ../../camera/camera_platform_interface + camera_web: + path: ../../camera/camera_web diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 7cdaacf213d..16a6f2a3627 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -20,7 +20,6 @@ flutter: dependencies: camera_platform_interface: - path: ../../camera/camera_platform_interface flutter: sdk: flutter flutter_plugin_android_lifecycle: ^2.0.2 @@ -33,3 +32,7 @@ dev_dependencies: flutter_test: sdk: flutter +# TODO: for PR +dependency_overrides: + camera_platform_interface: + path: ../../camera/camera_platform_interface \ No newline at end of file diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 91453823662..3a2d29c7ea2 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -21,7 +21,6 @@ flutter: dependencies: async: ^2.5.0 camera_platform_interface: - path: ../../camera/camera_platform_interface flutter: sdk: flutter @@ -36,3 +35,8 @@ dev_dependencies: sdk: flutter mockito: 5.4.1 pigeon: ^9.1.0 + +# TODO: for PR +dependency_overrides: + camera_platform_interface: + path: ../../camera/camera_platform_interface diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index f673eefa3c1..26f1e373202 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -19,7 +19,7 @@ flutter: dependencies: camera_platform_interface: - path: ../../camera/camera_platform_interface + flutter: sdk: flutter stream_transform: ^2.0.0 @@ -30,3 +30,8 @@ dev_dependencies: sdk: flutter flutter_test: sdk: flutter + +# TODO: for PR +dependency_overrides: + camera_platform_interface: + path: ../../camera/camera_platform_interface diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 22e9ec3faac..7aebad82b38 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -19,7 +19,6 @@ flutter: dependencies: camera_platform_interface: - path: ../../camera/camera_platform_interface flutter: sdk: flutter @@ -30,3 +29,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + +# TODO: for PR +dependency_overrides: + camera_platform_interface: + path: ../../camera/camera_platform_interface diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index ccd16e79dd6..6db2aa63f79 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -19,7 +19,6 @@ flutter: dependencies: camera_platform_interface: - path: ../../camera/camera_platform_interface cross_file: ^0.3.1 flutter: @@ -30,3 +29,8 @@ dev_dependencies: async: ^2.5.0 flutter_test: sdk: flutter + +# TODO: for PR +dependency_overrides: + camera_platform_interface: + path: ../../camera/camera_platform_interface From 863f79a8bbee4060426c2f754fefee15c4d71b79 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 6 Jun 2023 12:35:32 +0300 Subject: [PATCH 058/108] examples deps --- packages/camera/camera/example/pubspec.yaml | 10 ++++++++-- packages/camera/camera_android/example/pubspec.yaml | 9 +++++++-- .../camera_android_camerax/example/pubspec.yaml | 10 ++++++++-- .../camera/camera_avfoundation/example/pubspec.yaml | 8 ++++++-- packages/camera/camera_web/example/pubspec.yaml | 11 ++++++++--- packages/camera/camera_windows/example/pubspec.yaml | 12 +++++++++--- 6 files changed, 46 insertions(+), 14 deletions(-) diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index f6b308f7585..ce8d550a797 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -8,9 +8,8 @@ environment: dependencies: camera: - path: ../ camera_platform_interface: - path: ../../camera_platform_interface + flutter: sdk: flutter path_provider: ^2.0.0 @@ -27,3 +26,10 @@ dev_dependencies: flutter: uses-material-design: true + +# TODO: for PR +dependency_overrides: + camera: + path: ../ + camera_platform_interface: + path: ../../../camera/camera_platform_interface diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index 356dca297c2..c3aa61e263a 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -8,9 +8,7 @@ environment: dependencies: camera_android: - path: ../ camera_platform_interface: - path: ../../../camera/camera_platform_interface flutter: sdk: flutter path_provider: ^2.0.0 @@ -28,3 +26,10 @@ dev_dependencies: flutter: uses-material-design: true + +# TODO: for PR +dependency_overrides: + camera_android: + path: ../ + camera_platform_interface: + path: ../../../camera/camera_platform_interface diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index e6a56e3ddc0..36f1c7b151b 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -8,9 +8,8 @@ environment: dependencies: camera_android_camerax: - path: ../ camera_platform_interface: - path: ../../../camera/camera_platform_interface + flutter: sdk: flutter video_player: ^2.4.10 @@ -24,3 +23,10 @@ dev_dependencies: flutter: uses-material-design: true + +# TODO: for PR +dependency_overrides: + camera_android_camerax: + path: ../ + camera_platform_interface: + path: ../../../camera/camera_platform_interface diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index 8d49ca4a9b7..da7ee3b18da 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -8,9 +8,7 @@ environment: dependencies: camera_avfoundation: - path: ../ camera_platform_interface: - path: ../../../camera/camera_platform_interface flutter: sdk: flutter path_provider: ^2.0.0 @@ -28,3 +26,9 @@ dev_dependencies: flutter: uses-material-design: true + + # TODO: for PR + camera_avfoundation: + path: ../ + camera_platform_interface: + path: ../../../camera/camera_platform_interface diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index a5cb6a9c9fb..8311ce4cebf 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -7,10 +7,7 @@ environment: dependencies: camera_platform_interface: - path: ../../../camera/camera_platform_interface - camera_web: - path: ../ flutter: sdk: flutter @@ -25,3 +22,11 @@ dev_dependencies: integration_test: sdk: flutter mocktail: 0.3.0 + +# TODO: for PR +dependency_overrides: + camera_platform_interface: + path: ../../../camera/camera_platform_interface + + camera_web: + path: ../ diff --git a/packages/camera/camera_windows/example/pubspec.yaml b/packages/camera/camera_windows/example/pubspec.yaml index e0698e03a49..4875ff26b2a 100644 --- a/packages/camera/camera_windows/example/pubspec.yaml +++ b/packages/camera/camera_windows/example/pubspec.yaml @@ -8,10 +8,8 @@ environment: dependencies: camera_platform_interface: - path: ../../../camera/camera_platform_interface - camera_windows: - path: ../ + flutter: sdk: flutter @@ -24,3 +22,11 @@ dev_dependencies: flutter: uses-material-design: true + +# TODO: for PR +dependency_overrides: + camera_platform_interface: + path: ../../../camera/camera_platform_interface + + camera_windows: + path: ../ From 3bdf2213da53870924b0daf2cd8fa708fa16ca02 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 6 Jun 2023 12:39:51 +0300 Subject: [PATCH 059/108] examples deps --- packages/camera/camera_avfoundation/example/pubspec.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index da7ee3b18da..f4299150677 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -27,7 +27,8 @@ dev_dependencies: flutter: uses-material-design: true - # TODO: for PR +# TODO: for PR +dependency_overrides: camera_avfoundation: path: ../ camera_platform_interface: From 60606038c761d40cfd690b5c1570ab9dd6df9e6d Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 6 Jun 2023 12:53:57 +0300 Subject: [PATCH 060/108] packages deps --- packages/camera/camera/example/pubspec.yaml | 10 ++-------- packages/camera/camera/pubspec.yaml | 8 ++++---- packages/camera/camera_android/example/pubspec.yaml | 9 ++------- packages/camera/camera_android/pubspec.yaml | 2 +- .../camera_android_camerax/example/pubspec.yaml | 10 ++-------- packages/camera/camera_android_camerax/pubspec.yaml | 2 +- .../camera/camera_avfoundation/example/pubspec.yaml | 9 ++------- packages/camera/camera_avfoundation/pubspec.yaml | 2 +- packages/camera/camera_web/example/pubspec.yaml | 11 +++-------- packages/camera/camera_web/pubspec.yaml | 2 +- packages/camera/camera_windows/example/pubspec.yaml | 12 +++--------- packages/camera/camera_windows/pubspec.yaml | 2 +- 12 files changed, 23 insertions(+), 56 deletions(-) diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index ce8d550a797..f6b308f7585 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -8,8 +8,9 @@ environment: dependencies: camera: + path: ../ camera_platform_interface: - + path: ../../camera_platform_interface flutter: sdk: flutter path_provider: ^2.0.0 @@ -26,10 +27,3 @@ dev_dependencies: flutter: uses-material-design: true - -# TODO: for PR -dependency_overrides: - camera: - path: ../ - camera_platform_interface: - path: ../../../camera/camera_platform_interface diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index 748b7b77090..e329d391480 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -22,10 +22,10 @@ flutter: default_package: camera_web dependencies: - camera_android: - camera_avfoundation: - camera_platform_interface: - camera_web: + camera_android: ^0.10.8+3 + camera_avfoundation: ^0.9.13+3 + camera_platform_interface: ^2.6.0 + camera_web: ^0.3.1+5 flutter: sdk: flutter diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index c3aa61e263a..356dca297c2 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -8,7 +8,9 @@ environment: dependencies: camera_android: + path: ../ camera_platform_interface: + path: ../../../camera/camera_platform_interface flutter: sdk: flutter path_provider: ^2.0.0 @@ -26,10 +28,3 @@ dev_dependencies: flutter: uses-material-design: true - -# TODO: for PR -dependency_overrides: - camera_android: - path: ../ - camera_platform_interface: - path: ../../../camera/camera_platform_interface diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 16a6f2a3627..2ad4c6aa4bd 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -19,7 +19,7 @@ flutter: dartPluginClass: AndroidCamera dependencies: - camera_platform_interface: + camera_platform_interface: ^2.6.0 flutter: sdk: flutter flutter_plugin_android_lifecycle: ^2.0.2 diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index 36f1c7b151b..e6a56e3ddc0 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -8,8 +8,9 @@ environment: dependencies: camera_android_camerax: + path: ../ camera_platform_interface: - + path: ../../../camera/camera_platform_interface flutter: sdk: flutter video_player: ^2.4.10 @@ -23,10 +24,3 @@ dev_dependencies: flutter: uses-material-design: true - -# TODO: for PR -dependency_overrides: - camera_android_camerax: - path: ../ - camera_platform_interface: - path: ../../../camera/camera_platform_interface diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 3a2d29c7ea2..b409b24e343 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -20,7 +20,7 @@ flutter: dependencies: async: ^2.5.0 - camera_platform_interface: + camera_platform_interface: ^2.6.0 flutter: sdk: flutter diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index f4299150677..8d49ca4a9b7 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -8,7 +8,9 @@ environment: dependencies: camera_avfoundation: + path: ../ camera_platform_interface: + path: ../../../camera/camera_platform_interface flutter: sdk: flutter path_provider: ^2.0.0 @@ -26,10 +28,3 @@ dev_dependencies: flutter: uses-material-design: true - -# TODO: for PR -dependency_overrides: - camera_avfoundation: - path: ../ - camera_platform_interface: - path: ../../../camera/camera_platform_interface diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index 26f1e373202..6e1538dd6d6 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -18,7 +18,7 @@ flutter: dartPluginClass: AVFoundationCamera dependencies: - camera_platform_interface: + camera_platform_interface: ^2.6.0 flutter: sdk: flutter diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index 8311ce4cebf..a5cb6a9c9fb 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -7,7 +7,10 @@ environment: dependencies: camera_platform_interface: + path: ../../../camera/camera_platform_interface + camera_web: + path: ../ flutter: sdk: flutter @@ -22,11 +25,3 @@ dev_dependencies: integration_test: sdk: flutter mocktail: 0.3.0 - -# TODO: for PR -dependency_overrides: - camera_platform_interface: - path: ../../../camera/camera_platform_interface - - camera_web: - path: ../ diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 7aebad82b38..224b1a08204 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -18,7 +18,7 @@ flutter: fileName: camera_web.dart dependencies: - camera_platform_interface: + camera_platform_interface: ^2.6.0 flutter: sdk: flutter diff --git a/packages/camera/camera_windows/example/pubspec.yaml b/packages/camera/camera_windows/example/pubspec.yaml index 4875ff26b2a..e0698e03a49 100644 --- a/packages/camera/camera_windows/example/pubspec.yaml +++ b/packages/camera/camera_windows/example/pubspec.yaml @@ -8,8 +8,10 @@ environment: dependencies: camera_platform_interface: - camera_windows: + path: ../../../camera/camera_platform_interface + camera_windows: + path: ../ flutter: sdk: flutter @@ -22,11 +24,3 @@ dev_dependencies: flutter: uses-material-design: true - -# TODO: for PR -dependency_overrides: - camera_platform_interface: - path: ../../../camera/camera_platform_interface - - camera_windows: - path: ../ diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index 6db2aa63f79..c887359874c 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -18,7 +18,7 @@ flutter: dartPluginClass: CameraWindows dependencies: - camera_platform_interface: + camera_platform_interface: ^2.6.0 cross_file: ^0.3.1 flutter: From ca7e7c665c4e14295e101652d001a2236c3a105d Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 6 Jun 2023 13:21:51 +0300 Subject: [PATCH 061/108] publish_to: none removed --- packages/camera/camera/pubspec.yaml | 1 - packages/camera/camera_android/pubspec.yaml | 1 - packages/camera/camera_android_camerax/pubspec.yaml | 1 - packages/camera/camera_avfoundation/pubspec.yaml | 1 - packages/camera/camera_platform_interface/pubspec.yaml | 1 - packages/camera/camera_web/pubspec.yaml | 1 - packages/camera/camera_windows/pubspec.yaml | 1 - 7 files changed, 7 deletions(-) diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index e329d391480..468489602fb 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -4,7 +4,6 @@ description: A Flutter plugin for controlling the camera. Supports previewing Dart. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -publish_to: none version: 0.10.5+3 environment: diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 2ad4c6aa4bd..5cfe7798f08 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -2,7 +2,6 @@ name: camera_android 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 -publish_to: none version: 0.10.8+3 environment: diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index b409b24e343..be8d6e21586 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -2,7 +2,6 @@ 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 -publish_to: none version: 0.5.0+6 environment: diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index 6e1538dd6d6..6d70a0b1328 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -2,7 +2,6 @@ name: camera_avfoundation description: iOS implementation of the camera plugin. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_avfoundation issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -publish_to: none version: 0.9.13+3 environment: diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 56707cc75be..cbb7a401ad3 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,6 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -publish_to: none version: 2.6.0 environment: diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 224b1a08204..6c84a6e0d85 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -2,7 +2,6 @@ name: camera_web description: A Flutter plugin for getting information about and controlling the camera on Web. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -publish_to: none version: 0.3.1+5 environment: diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index c887359874c..2c067a6d8fa 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -2,7 +2,6 @@ name: camera_windows description: A Flutter plugin for getting information about and controlling the camera on Windows. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_windows issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -publish_to: none version: 0.2.1+8 environment: From 5146a65ca91294243c7c4778ab7c2fb48420bc68 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 6 Jun 2023 13:28:48 +0300 Subject: [PATCH 062/108] examples deps --- packages/camera/camera/example/pubspec.yaml | 2 -- packages/camera/camera_android/example/pubspec.yaml | 3 +-- packages/camera/camera_android_camerax/example/pubspec.yaml | 3 +-- packages/camera/camera_avfoundation/example/pubspec.yaml | 3 +-- packages/camera/camera_web/example/pubspec.yaml | 3 +-- packages/camera/camera_windows/example/pubspec.yaml | 4 ++-- 6 files changed, 6 insertions(+), 12 deletions(-) diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index f6b308f7585..8bfb07c8b6e 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -9,8 +9,6 @@ environment: dependencies: camera: path: ../ - camera_platform_interface: - path: ../../camera_platform_interface flutter: sdk: flutter path_provider: ^2.0.0 diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index 356dca297c2..95626e81b5c 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -9,8 +9,7 @@ environment: dependencies: camera_android: path: ../ - camera_platform_interface: - path: ../../../camera/camera_platform_interface + camera_platform_interface: ^2.6.0 flutter: sdk: flutter path_provider: ^2.0.0 diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index e6a56e3ddc0..76c6d79d431 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -9,8 +9,7 @@ environment: dependencies: camera_android_camerax: path: ../ - camera_platform_interface: - path: ../../../camera/camera_platform_interface + camera_platform_interface: ^2.6.0 flutter: sdk: flutter video_player: ^2.4.10 diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index 8d49ca4a9b7..91c06055c05 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -9,8 +9,7 @@ environment: dependencies: camera_avfoundation: path: ../ - camera_platform_interface: - path: ../../../camera/camera_platform_interface + camera_platform_interface: ^2.6.0 flutter: sdk: flutter path_provider: ^2.0.0 diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index a5cb6a9c9fb..b163f317ed3 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -6,8 +6,7 @@ environment: flutter: ">=3.3.0" dependencies: - camera_platform_interface: - path: ../../../camera/camera_platform_interface + camera_platform_interface: ^2.6.0 camera_web: path: ../ diff --git a/packages/camera/camera_windows/example/pubspec.yaml b/packages/camera/camera_windows/example/pubspec.yaml index e0698e03a49..b1237b59a1e 100644 --- a/packages/camera/camera_windows/example/pubspec.yaml +++ b/packages/camera/camera_windows/example/pubspec.yaml @@ -7,11 +7,11 @@ environment: flutter: ">=3.3.0" dependencies: - camera_platform_interface: - path: ../../../camera/camera_platform_interface + camera_platform_interface: ^2.6.0 camera_windows: path: ../ + flutter: sdk: flutter From 4e881fd357eda9dce77bac48afa61c2dcea08142 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 6 Jun 2023 13:41:56 +0300 Subject: [PATCH 063/108] removed host deps --- packages/camera/camera_android/example/pubspec.yaml | 2 +- packages/camera/camera_android_camerax/example/pubspec.yaml | 2 +- packages/camera/camera_avfoundation/example/pubspec.yaml | 2 +- packages/camera/camera_web/example/pubspec.yaml | 2 -- packages/camera/camera_windows/example/pubspec.yaml | 2 -- 5 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index 95626e81b5c..dfda0ff3db2 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: camera_android: path: ../ - camera_platform_interface: ^2.6.0 + flutter: sdk: flutter path_provider: ^2.0.0 diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index 76c6d79d431..cf83186d610 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: camera_android_camerax: path: ../ - camera_platform_interface: ^2.6.0 + flutter: sdk: flutter video_player: ^2.4.10 diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index 91c06055c05..211d4122bbc 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: camera_avfoundation: path: ../ - camera_platform_interface: ^2.6.0 + flutter: sdk: flutter path_provider: ^2.0.0 diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index b163f317ed3..11d44bdfac6 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -6,8 +6,6 @@ environment: flutter: ">=3.3.0" dependencies: - camera_platform_interface: ^2.6.0 - camera_web: path: ../ diff --git a/packages/camera/camera_windows/example/pubspec.yaml b/packages/camera/camera_windows/example/pubspec.yaml index b1237b59a1e..4822ad5e308 100644 --- a/packages/camera/camera_windows/example/pubspec.yaml +++ b/packages/camera/camera_windows/example/pubspec.yaml @@ -7,8 +7,6 @@ environment: flutter: ">=3.3.0" dependencies: - camera_platform_interface: ^2.6.0 - camera_windows: path: ../ From 4f07db2616e198a45498d6c0b240d5b496fbd117 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 6 Jun 2023 14:27:49 +0300 Subject: [PATCH 064/108] camera deps --- packages/camera/camera/pubspec.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index 468489602fb..d7ae0a5a0f0 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -21,10 +21,10 @@ flutter: default_package: camera_web dependencies: - camera_android: ^0.10.8+3 - camera_avfoundation: ^0.9.13+3 - camera_platform_interface: ^2.6.0 - camera_web: ^0.3.1+5 + camera_android: ^0.10.8+2 + camera_avfoundation: ^0.9.13+2 + camera_platform_interface: ^2.5.1 + camera_web: ^0.3.1+4 flutter: sdk: flutter From a707e4895526a450833e9efbc245a2a95caff783 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 6 Jun 2023 14:31:06 +0300 Subject: [PATCH 065/108] camera deps --- packages/camera/camera_android_camerax/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index be8d6e21586..6172de6f88d 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -19,7 +19,7 @@ flutter: dependencies: async: ^2.5.0 - camera_platform_interface: ^2.6.0 + camera_platform_interface: ^2.5.1 flutter: sdk: flutter From d50992d159e11187bc29d851cdb5d437135ac92c Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 6 Jun 2023 14:34:42 +0300 Subject: [PATCH 066/108] camera deps --- packages/camera/camera_android/pubspec.yaml | 2 +- packages/camera/camera_avfoundation/pubspec.yaml | 2 +- packages/camera/camera_web/pubspec.yaml | 2 +- packages/camera/camera_windows/pubspec.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 5cfe7798f08..2c3a780afab 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -18,7 +18,7 @@ flutter: dartPluginClass: AndroidCamera dependencies: - camera_platform_interface: ^2.6.0 + camera_platform_interface: ^2.5.1 flutter: sdk: flutter flutter_plugin_android_lifecycle: ^2.0.2 diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index 6d70a0b1328..c22ade413e3 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -17,7 +17,7 @@ flutter: dartPluginClass: AVFoundationCamera dependencies: - camera_platform_interface: ^2.6.0 + camera_platform_interface: ^2.5.1 flutter: sdk: flutter diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 6c84a6e0d85..e36e9c16a08 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -17,7 +17,7 @@ flutter: fileName: camera_web.dart dependencies: - camera_platform_interface: ^2.6.0 + camera_platform_interface: ^2.5.1 flutter: sdk: flutter diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index 2c067a6d8fa..8fa98587e06 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -17,7 +17,7 @@ flutter: dartPluginClass: CameraWindows dependencies: - camera_platform_interface: ^2.6.0 + camera_platform_interface: ^2.5.1 cross_file: ^0.3.1 flutter: From fb995865a80dca121b051505fab189af48017efe Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 6 Jun 2023 14:49:50 +0300 Subject: [PATCH 067/108] camera deps --- packages/camera/camera/example/pubspec.yaml | 7 +++++++ packages/camera/camera/pubspec.yaml | 12 ++++++++---- packages/camera/camera_android/example/pubspec.yaml | 7 +++++++ packages/camera/camera_android/pubspec.yaml | 6 +++++- .../camera_android_camerax/example/pubspec.yaml | 7 +++++++ packages/camera/camera_android_camerax/pubspec.yaml | 6 +++++- .../camera/camera_avfoundation/example/pubspec.yaml | 7 +++++++ packages/camera/camera_avfoundation/pubspec.yaml | 6 +++++- packages/camera/camera_web/example/pubspec.yaml | 7 +++++++ packages/camera/camera_web/pubspec.yaml | 6 +++++- packages/camera/camera_windows/example/pubspec.yaml | 7 +++++++ packages/camera/camera_windows/pubspec.yaml | 6 +++++- 12 files changed, 75 insertions(+), 9 deletions(-) diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index 8bfb07c8b6e..6d82a0cdb19 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -9,6 +9,8 @@ environment: dependencies: camera: path: ../ + camera_platform_interface: + path: ../../camera_platform_interface flutter: sdk: flutter path_provider: ^2.0.0 @@ -25,3 +27,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {camera: {path: ../../../camera/camera}, camera_android: {path: ../../../camera/camera_android}, camera_avfoundation: {path: ../../../camera/camera_avfoundation}, camera_platform_interface: {path: ../../../camera/camera_platform_interface}, camera_web: {path: ../../../camera/camera_web}} diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index d7ae0a5a0f0..f1a4c6ac6b1 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -41,12 +41,16 @@ dev_dependencies: video_player: ^2.0.0 # TODO: for PR + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: - camera_android: + + camera_android: path: ../../camera/camera_android - camera_avfoundation: + camera_avfoundation: path: ../../camera/camera_avfoundation - camera_platform_interface: + camera_platform_interface: path: ../../camera/camera_platform_interface - camera_web: + camera_web: path: ../../camera/camera_web diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index dfda0ff3db2..ff48a394f8d 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -9,6 +9,8 @@ environment: dependencies: camera_android: path: ../ + camera_platform_interface: + path: ../../camera_platform_interface flutter: sdk: flutter @@ -27,3 +29,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {camera_android: {path: ../../../camera/camera_android}, camera_platform_interface: {path: ../../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 2c3a780afab..357ee5a71c6 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -32,6 +32,10 @@ dev_dependencies: sdk: flutter # TODO: for PR + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: - camera_platform_interface: + + camera_platform_interface: path: ../../camera/camera_platform_interface \ No newline at end of file diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index cf83186d610..d94fd3a330f 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -9,6 +9,8 @@ environment: dependencies: camera_android_camerax: path: ../ + camera_platform_interface: + path: ../../camera_platform_interface flutter: sdk: flutter @@ -23,3 +25,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {camera_android_camerax: {path: ../../../camera/camera_android_camerax}, camera_platform_interface: {path: ../../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 6172de6f88d..34f25c5c515 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -36,6 +36,10 @@ dev_dependencies: pigeon: ^9.1.0 # TODO: for PR + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: - camera_platform_interface: + + camera_platform_interface: path: ../../camera/camera_platform_interface diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index 211d4122bbc..0b7c64e44be 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -9,6 +9,8 @@ environment: dependencies: camera_avfoundation: path: ../ + camera_platform_interface: + path: ../../camera_platform_interface flutter: sdk: flutter @@ -27,3 +29,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {camera_avfoundation: {path: ../../../camera/camera_avfoundation}, camera_platform_interface: {path: ../../../camera/camera_platform_interface}} diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index c22ade413e3..1533b5e127d 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -31,6 +31,10 @@ dev_dependencies: sdk: flutter # TODO: for PR + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: - camera_platform_interface: + + camera_platform_interface: path: ../../camera/camera_platform_interface diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index 11d44bdfac6..72a527a8640 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -6,6 +6,8 @@ environment: flutter: ">=3.3.0" dependencies: + camera_platform_interface: + path: ../../camera_platform_interface camera_web: path: ../ @@ -22,3 +24,8 @@ dev_dependencies: integration_test: sdk: flutter mocktail: 0.3.0 + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {camera_platform_interface: {path: ../../../camera/camera_platform_interface}, camera_web: {path: ../../../camera/camera_web}} diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index e36e9c16a08..246f6173367 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -30,6 +30,10 @@ dev_dependencies: sdk: flutter # TODO: for PR + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: - camera_platform_interface: + + camera_platform_interface: path: ../../camera/camera_platform_interface diff --git a/packages/camera/camera_windows/example/pubspec.yaml b/packages/camera/camera_windows/example/pubspec.yaml index 4822ad5e308..8e713357fa1 100644 --- a/packages/camera/camera_windows/example/pubspec.yaml +++ b/packages/camera/camera_windows/example/pubspec.yaml @@ -7,6 +7,8 @@ environment: flutter: ">=3.3.0" dependencies: + camera_platform_interface: + path: ../../camera_platform_interface camera_windows: path: ../ @@ -22,3 +24,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins +dependency_overrides: + {camera_platform_interface: {path: ../../../camera/camera_platform_interface}, camera_windows: {path: ../../../camera/camera_windows}} diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index 8fa98587e06..14cd7ce6680 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -30,6 +30,10 @@ dev_dependencies: sdk: flutter # TODO: for PR + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins dependency_overrides: - camera_platform_interface: + + camera_platform_interface: path: ../../camera/camera_platform_interface From a0ca63aa4590443a2108311b3abdbc56f3c500d2 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 6 Jun 2023 15:11:29 +0300 Subject: [PATCH 068/108] around dependabot --- packages/camera/camera_android_camerax/CHANGELOG.md | 4 ++-- packages/camera/camera_android_camerax/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index e879610d627..7e58ae48dab 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,6 +1,6 @@ -## 0.5.0+6 +## 0.5.0+7 -* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control.## 0.5.0+5 +* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. ## 0.5.0+5 diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 34f25c5c515..f9882f029a0 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.5.0+6 +version: 0.5.0+7 environment: sdk: ">=2.19.0 <4.0.0" From 065345622ae08a40d9201c0e23a65973bf943533 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 21 Jun 2023 09:08:44 +0300 Subject: [PATCH 069/108] changelogs updated --- packages/camera/camera/CHANGELOG.md | 3 +-- packages/camera/camera_android/CHANGELOG.md | 3 +-- packages/camera/camera_avfoundation/CHANGELOG.md | 2 +- packages/camera/camera_platform_interface/CHANGELOG.md | 2 +- packages/camera/camera_web/CHANGELOG.md | 2 +- packages/camera/camera_windows/CHANGELOG.md | 2 +- 6 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index 345844ece0e..a2f34690400 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.10.5+3 -* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. +* Adds support to control video fps and bitrate. See `CameraController.withSettings`. ## 0.10.5+2 @@ -16,7 +16,6 @@ ## 0.10.4 -* Adds support to control video fps and bitrate. * Allows camera to be switched while video recording. * Updates minimum Flutter version to 3.3. * Aligns Dart and Flutter SDK constraints. diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index 72e82430e2f..caf9910cfca 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.10.8+3 -* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. +* Adds support to control video fps and bitrate. See `CameraController.withSettings`. * Fixes unawaited_futures violations. * Removes duplicate line in `MediaRecorderBuilder.java`. @@ -29,7 +29,6 @@ ## 0.10.6+1 * Adds a namespace for compatibility with AGP 8.0. -* Adds `CameraPlatform.createCameraWithSettings` to allow recorded video fps and bitrate control. * Bump: `com.android.tools.build:gradle:7.2.0` ## 0.10.6 diff --git a/packages/camera/camera_avfoundation/CHANGELOG.md b/packages/camera/camera_avfoundation/CHANGELOG.md index c852af22d73..cc992a7ae7a 100644 --- a/packages/camera/camera_avfoundation/CHANGELOG.md +++ b/packages/camera/camera_avfoundation/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.9.13+3 -* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. +* Adds support to control video fps and bitrate. See `CameraController.withSettings`. * Fixes unawaited_futures violations. ## 0.9.13+2 diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index 7e05395cb32..3cdf3a5ccd2 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,6 +1,6 @@ ## 2.6.0 -* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. +* Adds support to control video fps and bitrate. See `CameraController.withSettings`. ## 2.5.1 diff --git a/packages/camera/camera_web/CHANGELOG.md b/packages/camera/camera_web/CHANGELOG.md index 5b1b297bb1f..74a59758582 100644 --- a/packages/camera/camera_web/CHANGELOG.md +++ b/packages/camera/camera_web/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.3.1+5 -* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. +* Adds support to control video fps and bitrate. See `CameraController.withSettings`. ## 0.3.1+4 diff --git a/packages/camera/camera_windows/CHANGELOG.md b/packages/camera/camera_windows/CHANGELOG.md index 6ebe962d3dd..65a45dafb21 100644 --- a/packages/camera/camera_windows/CHANGELOG.md +++ b/packages/camera/camera_windows/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.2.1+8 -* CameraPlatform.createCameraWithSettings to allow recorded video fps and bitrate control. +* Adds support to control video fps and bitrate. See `CameraController.withSettings`. ## 0.2.1+7 From 0cb06dacfcda6accc931dfd3e6b843209ed314ad Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 21 Jun 2023 09:18:32 +0300 Subject: [PATCH 070/108] MediaSettings export from camera/camera.dart --- packages/camera/camera/README.md | 1 - .../example/integration_test/camera_test.dart | 29 ++-- packages/camera/camera/example/lib/main.dart | 138 ++++++------------ .../example/lib/readme_full_example.dart | 1 - packages/camera/camera/lib/camera.dart | 3 +- .../camera/test/camera_preview_test.dart | 49 +++---- 6 files changed, 75 insertions(+), 146 deletions(-) diff --git a/packages/camera/camera/README.md b/packages/camera/camera/README.md index ed9ac7fed30..752dd79198d 100644 --- a/packages/camera/camera/README.md +++ b/packages/camera/camera/README.md @@ -100,7 +100,6 @@ Here is a small example flutter app displaying a full screen camera preview. ```dart import 'package:camera/camera.dart'; -import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/material.dart'; late List _cameras; diff --git a/packages/camera/camera/example/integration_test/camera_test.dart b/packages/camera/camera/example/integration_test/camera_test.dart index 492b775689e..70a5375abd6 100644 --- a/packages/camera/camera/example/integration_test/camera_test.dart +++ b/packages/camera/camera/example/integration_test/camera_test.dart @@ -7,7 +7,6 @@ import 'dart:io'; import 'dart:ui'; import 'package:camera/camera.dart'; -import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/painting.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; @@ -28,12 +27,9 @@ void main() { await testDir.delete(recursive: true); }); - final Map presetExpectedSizes = - { - ResolutionPreset.low: - Platform.isAndroid ? const Size(240, 320) : const Size(288, 352), - ResolutionPreset.medium: - Platform.isAndroid ? const Size(480, 720) : const Size(480, 640), + final Map presetExpectedSizes = { + ResolutionPreset.low: Platform.isAndroid ? const Size(240, 320) : const Size(288, 352), + ResolutionPreset.medium: Platform.isAndroid ? const Size(480, 720) : const Size(480, 640), ResolutionPreset.high: const Size(720, 1280), ResolutionPreset.veryHigh: const Size(1080, 1920), ResolutionPreset.ultraHigh: const Size(2160, 3840), @@ -79,8 +75,7 @@ void main() { } for (final CameraDescription cameraDescription in cameras) { bool previousPresetExactlySupported = true; - for (final MapEntry preset - in presetExpectedSizes.entries) { + for (final MapEntry preset in presetExpectedSizes.entries) { final CameraController controller = CameraController.withSettings( cameraDescription, mediaSettings: MediaSettings( @@ -115,15 +110,13 @@ void main() { // Load video metadata final File videoFile = File(file.path); - final VideoPlayerController videoController = - VideoPlayerController.file(videoFile); + final VideoPlayerController videoController = VideoPlayerController.file(videoFile); await videoController.initialize(); final Size video = videoController.value.size; // Verify image dimensions are as expected expect(video, isNotNull); - return assertExpectedDimensions( - expectedSize, Size(video.height, video.width)); + return assertExpectedDimensions(expectedSize, Size(video.height, video.width)); } testWidgets( @@ -135,8 +128,7 @@ void main() { } for (final CameraDescription cameraDescription in cameras) { bool previousPresetExactlySupported = true; - for (final MapEntry preset - in presetExpectedSizes.entries) { + for (final MapEntry preset in presetExpectedSizes.entries) { final CameraController controller = CameraController.withSettings( cameraDescription, mediaSettings: MediaSettings( @@ -201,8 +193,7 @@ void main() { sleep(const Duration(milliseconds: 500)); final XFile file = await controller.stopVideoRecording(); - final int recordingTime = - DateTime.now().millisecondsSinceEpoch - recordingStart; + final int recordingTime = DateTime.now().millisecondsSinceEpoch - recordingStart; final File videoFile = File(file.path); final VideoPlayerController videoController = VideoPlayerController.file( @@ -257,8 +248,8 @@ void main() { ); /// Start streaming with specifying the ImageFormatGroup. - Future startStreaming(List cameras, - ImageFormatGroup? imageFormatGroup) async { + Future startStreaming( + List cameras, ImageFormatGroup? imageFormatGroup) async { final CameraController controller = CameraController.withSettings( cameras.first, mediaSettings: const MediaSettings( diff --git a/packages/camera/camera/example/lib/main.dart b/packages/camera/camera/example/lib/main.dart index 7abfed8a904..dadb6c912c8 100644 --- a/packages/camera/camera/example/lib/main.dart +++ b/packages/camera/camera/example/lib/main.dart @@ -6,7 +6,6 @@ import 'dart:async'; import 'dart:io'; import 'package:camera/camera.dart'; -import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; @@ -139,10 +138,9 @@ class _CameraExampleHomeState extends State decoration: BoxDecoration( color: Colors.black, border: Border.all( - color: - controller != null && controller!.value.isRecordingVideo - ? Colors.redAccent - : Colors.grey, + color: controller != null && controller!.value.isRecordingVideo + ? Colors.redAccent + : Colors.grey, width: 3.0, ), ), @@ -189,14 +187,12 @@ class _CameraExampleHomeState extends State onPointerUp: (_) => _pointers--, child: CameraPreview( controller!, - child: LayoutBuilder( - builder: (BuildContext context, BoxConstraints constraints) { + child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) { return GestureDetector( behavior: HitTestBehavior.opaque, onScaleStart: _handleScaleStart, onScaleUpdate: _handleScaleUpdate, - onTapDown: (TapDownDetails details) => - onViewFinderTap(details, constraints), + onTapDown: (TapDownDetails details) => onViewFinderTap(details, constraints), ); }), ), @@ -214,8 +210,7 @@ class _CameraExampleHomeState extends State return; } - _currentScale = (_baseScale * details.scale) - .clamp(_minAvailableZoom, _maxAvailableZoom); + _currentScale = (_baseScale * details.scale).clamp(_minAvailableZoom, _maxAvailableZoom); await controller!.setZoomLevel(_currentScale); } @@ -242,16 +237,12 @@ class _CameraExampleHomeState extends State // pointing to a location within the browser. It may be displayed // either with Image.network or Image.memory after loading the image // bytes to memory. - kIsWeb - ? Image.network(imageFile!.path) - : Image.file(File(imageFile!.path))) + kIsWeb ? Image.network(imageFile!.path) : Image.file(File(imageFile!.path))) : Container( - decoration: BoxDecoration( - border: Border.all(color: Colors.pink)), + decoration: BoxDecoration(border: Border.all(color: Colors.pink)), child: Center( child: AspectRatio( - aspectRatio: - localVideoController.value.aspectRatio, + aspectRatio: localVideoController.value.aspectRatio, child: VideoPlayer(localVideoController)), ), ), @@ -280,15 +271,12 @@ class _CameraExampleHomeState extends State IconButton( icon: const Icon(Icons.exposure), color: Colors.blue, - onPressed: controller != null - ? onExposureModeButtonPressed - : null, + onPressed: controller != null ? onExposureModeButtonPressed : null, ), IconButton( icon: const Icon(Icons.filter_center_focus), color: Colors.blue, - onPressed: - controller != null ? onFocusModeButtonPressed : null, + onPressed: controller != null ? onFocusModeButtonPressed : null, ) ] : [], @@ -302,9 +290,7 @@ class _CameraExampleHomeState extends State ? Icons.screen_lock_rotation : Icons.screen_rotation), color: Colors.blue, - onPressed: controller != null - ? onCaptureOrientationLockButtonPressed - : null, + onPressed: controller != null ? onCaptureOrientationLockButtonPressed : null, ), ], ), @@ -324,39 +310,27 @@ class _CameraExampleHomeState extends State children: [ IconButton( icon: const Icon(Icons.flash_off), - color: controller?.value.flashMode == FlashMode.off - ? Colors.orange - : Colors.blue, - onPressed: controller != null - ? () => onSetFlashModeButtonPressed(FlashMode.off) - : null, + color: controller?.value.flashMode == FlashMode.off ? Colors.orange : Colors.blue, + onPressed: + controller != null ? () => onSetFlashModeButtonPressed(FlashMode.off) : null, ), IconButton( icon: const Icon(Icons.flash_auto), - color: controller?.value.flashMode == FlashMode.auto - ? Colors.orange - : Colors.blue, - onPressed: controller != null - ? () => onSetFlashModeButtonPressed(FlashMode.auto) - : null, + color: controller?.value.flashMode == FlashMode.auto ? Colors.orange : Colors.blue, + onPressed: + controller != null ? () => onSetFlashModeButtonPressed(FlashMode.auto) : null, ), IconButton( icon: const Icon(Icons.flash_on), - color: controller?.value.flashMode == FlashMode.always - ? Colors.orange - : Colors.blue, - onPressed: controller != null - ? () => onSetFlashModeButtonPressed(FlashMode.always) - : null, + color: controller?.value.flashMode == FlashMode.always ? Colors.orange : Colors.blue, + onPressed: + controller != null ? () => onSetFlashModeButtonPressed(FlashMode.always) : null, ), IconButton( icon: const Icon(Icons.highlight), - color: controller?.value.flashMode == FlashMode.torch - ? Colors.orange - : Colors.blue, - onPressed: controller != null - ? () => onSetFlashModeButtonPressed(FlashMode.torch) - : null, + color: controller?.value.flashMode == FlashMode.torch ? Colors.orange : Colors.blue, + onPressed: + controller != null ? () => onSetFlashModeButtonPressed(FlashMode.torch) : null, ), ], ), @@ -368,16 +342,12 @@ class _CameraExampleHomeState extends State final ButtonStyle styleAuto = TextButton.styleFrom( // TODO(darrenaustin): Migrate to new API once it lands in stable: https://github.com/flutter/flutter/issues/105724 // ignore: deprecated_member_use - primary: controller?.value.exposureMode == ExposureMode.auto - ? Colors.orange - : Colors.blue, + primary: controller?.value.exposureMode == ExposureMode.auto ? Colors.orange : Colors.blue, ); final ButtonStyle styleLocked = TextButton.styleFrom( // TODO(darrenaustin): Migrate to new API once it lands in stable: https://github.com/flutter/flutter/issues/105724 // ignore: deprecated_member_use - primary: controller?.value.exposureMode == ExposureMode.locked - ? Colors.orange - : Colors.blue, + primary: controller?.value.exposureMode == ExposureMode.locked ? Colors.orange : Colors.blue, ); return SizeTransition( @@ -396,8 +366,7 @@ class _CameraExampleHomeState extends State TextButton( style: styleAuto, onPressed: controller != null - ? () => - onSetExposureModeButtonPressed(ExposureMode.auto) + ? () => onSetExposureModeButtonPressed(ExposureMode.auto) : null, onLongPress: () { if (controller != null) { @@ -410,16 +379,13 @@ class _CameraExampleHomeState extends State TextButton( style: styleLocked, onPressed: controller != null - ? () => - onSetExposureModeButtonPressed(ExposureMode.locked) + ? () => onSetExposureModeButtonPressed(ExposureMode.locked) : null, child: const Text('LOCKED'), ), TextButton( style: styleLocked, - onPressed: controller != null - ? () => controller!.setExposureOffset(0.0) - : null, + onPressed: controller != null ? () => controller!.setExposureOffset(0.0) : null, child: const Text('RESET OFFSET'), ), ], @@ -436,8 +402,7 @@ class _CameraExampleHomeState extends State min: _minAvailableExposureOffset, max: _maxAvailableExposureOffset, label: _currentExposureOffset.toString(), - onChanged: _minAvailableExposureOffset == - _maxAvailableExposureOffset + onChanged: _minAvailableExposureOffset == _maxAvailableExposureOffset ? null : setExposureOffset, ), @@ -455,16 +420,12 @@ class _CameraExampleHomeState extends State final ButtonStyle styleAuto = TextButton.styleFrom( // TODO(darrenaustin): Migrate to new API once it lands in stable: https://github.com/flutter/flutter/issues/105724 // ignore: deprecated_member_use - primary: controller?.value.focusMode == FocusMode.auto - ? Colors.orange - : Colors.blue, + primary: controller?.value.focusMode == FocusMode.auto ? Colors.orange : Colors.blue, ); final ButtonStyle styleLocked = TextButton.styleFrom( // TODO(darrenaustin): Migrate to new API once it lands in stable: https://github.com/flutter/flutter/issues/105724 // ignore: deprecated_member_use - primary: controller?.value.focusMode == FocusMode.locked - ? Colors.orange - : Colors.blue, + primary: controller?.value.focusMode == FocusMode.locked ? Colors.orange : Colors.blue, ); return SizeTransition( @@ -535,8 +496,7 @@ class _CameraExampleHomeState extends State : null, ), IconButton( - icon: cameraController != null && - cameraController.value.isRecordingPaused + icon: cameraController != null && cameraController.value.isRecordingPaused ? const Icon(Icons.play_arrow) : const Icon(Icons.pause), color: Colors.blue, @@ -559,12 +519,10 @@ class _CameraExampleHomeState extends State ), IconButton( icon: const Icon(Icons.pause_presentation), - color: - cameraController != null && cameraController.value.isPreviewPaused - ? Colors.red - : Colors.blue, - onPressed: - cameraController == null ? null : onPausePreviewButtonPressed, + color: cameraController != null && cameraController.value.isPreviewPaused + ? Colors.red + : Colors.blue, + onPressed: cameraController == null ? null : onPausePreviewButtonPressed, ), ], ); @@ -609,8 +567,7 @@ class _CameraExampleHomeState extends State String timestamp() => DateTime.now().millisecondsSinceEpoch.toString(); void showInSnackBar(String message) { - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar(content: Text(message))); + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(message))); } void onViewFinderTap(TapDownDetails details, BoxConstraints constraints) { @@ -636,8 +593,7 @@ class _CameraExampleHomeState extends State } } - Future _initializeCameraController( - CameraDescription cameraDescription) async { + Future _initializeCameraController(CameraDescription cameraDescription) async { final CameraController cameraController = CameraController.withSettings( cameraDescription, mediaSettings: MediaSettings( @@ -658,8 +614,7 @@ class _CameraExampleHomeState extends State setState(() {}); } if (cameraController.value.hasError) { - showInSnackBar( - 'Camera error ${cameraController.value.errorDescription}'); + showInSnackBar('Camera error ${cameraController.value.errorDescription}'); } }); @@ -669,19 +624,16 @@ class _CameraExampleHomeState extends State // The exposure mode is currently not supported on the web. ...!kIsWeb ? >[ - cameraController.getMinExposureOffset().then( - (double value) => _minAvailableExposureOffset = value), + cameraController + .getMinExposureOffset() + .then((double value) => _minAvailableExposureOffset = value), cameraController .getMaxExposureOffset() .then((double value) => _maxAvailableExposureOffset = value) ] : >[], - cameraController - .getMaxZoomLevel() - .then((double value) => _maxAvailableZoom = value), - cameraController - .getMinZoomLevel() - .then((double value) => _minAvailableZoom = value), + cameraController.getMaxZoomLevel().then((double value) => _maxAvailableZoom = value), + cameraController.getMinZoomLevel().then((double value) => _minAvailableZoom = value), ]); } on CameraException catch (e) { switch (e.code) { diff --git a/packages/camera/camera/example/lib/readme_full_example.dart b/packages/camera/camera/example/lib/readme_full_example.dart index 1935892566a..4d7b4f9ffa1 100644 --- a/packages/camera/camera/example/lib/readme_full_example.dart +++ b/packages/camera/camera/example/lib/readme_full_example.dart @@ -4,7 +4,6 @@ // #docregion FullAppExample import 'package:camera/camera.dart'; -import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/material.dart'; late List _cameras; diff --git a/packages/camera/camera/lib/camera.dart b/packages/camera/camera/lib/camera.dart index 900c2633a5d..af024e00dca 100644 --- a/packages/camera/camera/lib/camera.dart +++ b/packages/camera/camera/lib/camera.dart @@ -12,7 +12,8 @@ export 'package:camera_platform_interface/camera_platform_interface.dart' FocusMode, ResolutionPreset, XFile, - ImageFormatGroup; + ImageFormatGroup, + MediaSettings; export 'src/camera_controller.dart'; export 'src/camera_image.dart'; diff --git a/packages/camera/camera/test/camera_preview_test.dart b/packages/camera/camera/test/camera_preview_test.dart index a41ec163813..af7abcc298b 100644 --- a/packages/camera/camera/test/camera_preview_test.dart +++ b/packages/camera/camera/test/camera_preview_test.dart @@ -3,19 +3,17 @@ // found in the LICENSE file. import 'package:camera/camera.dart'; -import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -class FakeController extends ValueNotifier - implements CameraController { +class FakeController extends ValueNotifier implements CameraController { FakeController() : super(const CameraValue.uninitialized(fakeDescription)); - static const CameraDescription fakeDescription = CameraDescription( - name: '', lensDirection: CameraLensDirection.back, sensorOrientation: 0); + static const CameraDescription fakeDescription = + CameraDescription(name: '', lensDirection: CameraLensDirection.back, sensorOrientation: 0); @override Future dispose() async { @@ -100,8 +98,7 @@ class FakeController extends ValueNotifier Future startImageStream(onLatestImageAvailable onAvailable) async {} @override - Future startVideoRecording( - {onLatestImageAvailable? onAvailable}) async {} + Future startVideoRecording({onLatestImageAvailable? onAvailable}) async {} @override Future stopImageStream() async {} @@ -130,9 +127,7 @@ class FakeController extends ValueNotifier void main() { group('RotatedBox (Android only)', () { - testWidgets( - 'when recording rotatedBox should turn according to recording orientation', - ( + testWidgets('when recording rotatedBox should turn according to recording orientation', ( WidgetTester tester, ) async { debugDefaultTargetPlatformOverride = TargetPlatform.android; @@ -143,10 +138,9 @@ void main() { isRecordingVideo: true, deviceOrientation: DeviceOrientation.portraitUp, lockedCaptureOrientation: - const Optional.fromNullable( - DeviceOrientation.landscapeRight), - recordingOrientation: const Optional.fromNullable( - DeviceOrientation.landscapeLeft), + const Optional.fromNullable(DeviceOrientation.landscapeRight), + recordingOrientation: + const Optional.fromNullable(DeviceOrientation.landscapeLeft), previewSize: const Size(480, 640), ); @@ -158,16 +152,13 @@ void main() { ); expect(find.byType(RotatedBox), findsOneWidget); - final RotatedBox rotatedBox = - tester.widget(find.byType(RotatedBox)); + final RotatedBox rotatedBox = tester.widget(find.byType(RotatedBox)); expect(rotatedBox.quarterTurns, 3); debugDefaultTargetPlatformOverride = null; }); - testWidgets( - 'when orientation locked rotatedBox should turn according to locked orientation', - ( + testWidgets('when orientation locked rotatedBox should turn according to locked orientation', ( WidgetTester tester, ) async { debugDefaultTargetPlatformOverride = TargetPlatform.android; @@ -177,10 +168,9 @@ void main() { isInitialized: true, deviceOrientation: DeviceOrientation.portraitUp, lockedCaptureOrientation: - const Optional.fromNullable( - DeviceOrientation.landscapeRight), - recordingOrientation: const Optional.fromNullable( - DeviceOrientation.landscapeLeft), + const Optional.fromNullable(DeviceOrientation.landscapeRight), + recordingOrientation: + const Optional.fromNullable(DeviceOrientation.landscapeLeft), previewSize: const Size(480, 640), ); @@ -192,8 +182,7 @@ void main() { ); expect(find.byType(RotatedBox), findsOneWidget); - final RotatedBox rotatedBox = - tester.widget(find.byType(RotatedBox)); + final RotatedBox rotatedBox = tester.widget(find.byType(RotatedBox)); expect(rotatedBox.quarterTurns, 1); debugDefaultTargetPlatformOverride = null; @@ -210,8 +199,8 @@ void main() { controller.value = controller.value.copyWith( isInitialized: true, deviceOrientation: DeviceOrientation.portraitUp, - recordingOrientation: const Optional.fromNullable( - DeviceOrientation.landscapeLeft), + recordingOrientation: + const Optional.fromNullable(DeviceOrientation.landscapeLeft), previewSize: const Size(480, 640), ); @@ -223,16 +212,14 @@ void main() { ); expect(find.byType(RotatedBox), findsOneWidget); - final RotatedBox rotatedBox = - tester.widget(find.byType(RotatedBox)); + final RotatedBox rotatedBox = tester.widget(find.byType(RotatedBox)); expect(rotatedBox.quarterTurns, 0); debugDefaultTargetPlatformOverride = null; }); }, skip: kIsWeb); - testWidgets('when not on Android there should not be a rotated box', - (WidgetTester tester) async { + testWidgets('when not on Android there should not be a rotated box', (WidgetTester tester) async { debugDefaultTargetPlatformOverride = TargetPlatform.iOS; final FakeController controller = FakeController(); controller.value = controller.value.copyWith( From 2cc95af28b47571fedfde97a9ce017096cc1e493 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 21 Jun 2023 09:54:08 +0300 Subject: [PATCH 071/108] camera/camera_controller.dart restored resolutionPreset and enableAudio --- packages/camera/camera/CHANGELOG.md | 2 +- .../example/integration_test/camera_test.dart | 28 ++-- packages/camera/camera/example/lib/main.dart | 137 ++++++++++++------ packages/camera/camera/example/pubspec.yaml | 7 +- .../camera/lib/src/camera_controller.dart | 24 ++- packages/camera/camera/pubspec.yaml | 2 +- .../camera/test/camera_preview_test.dart | 54 ++++--- .../method_channel/method_channel_camera.dart | 11 ++ 8 files changed, 185 insertions(+), 80 deletions(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index a2f34690400..5a37fbecc15 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.10.5+3 +## 0.10.6 * Adds support to control video fps and bitrate. See `CameraController.withSettings`. diff --git a/packages/camera/camera/example/integration_test/camera_test.dart b/packages/camera/camera/example/integration_test/camera_test.dart index 70a5375abd6..e12dc191f81 100644 --- a/packages/camera/camera/example/integration_test/camera_test.dart +++ b/packages/camera/camera/example/integration_test/camera_test.dart @@ -27,9 +27,12 @@ void main() { await testDir.delete(recursive: true); }); - final Map presetExpectedSizes = { - ResolutionPreset.low: Platform.isAndroid ? const Size(240, 320) : const Size(288, 352), - ResolutionPreset.medium: Platform.isAndroid ? const Size(480, 720) : const Size(480, 640), + final Map presetExpectedSizes = + { + ResolutionPreset.low: + Platform.isAndroid ? const Size(240, 320) : const Size(288, 352), + ResolutionPreset.medium: + Platform.isAndroid ? const Size(480, 720) : const Size(480, 640), ResolutionPreset.high: const Size(720, 1280), ResolutionPreset.veryHigh: const Size(1080, 1920), ResolutionPreset.ultraHigh: const Size(2160, 3840), @@ -75,7 +78,8 @@ void main() { } for (final CameraDescription cameraDescription in cameras) { bool previousPresetExactlySupported = true; - for (final MapEntry preset in presetExpectedSizes.entries) { + for (final MapEntry preset + in presetExpectedSizes.entries) { final CameraController controller = CameraController.withSettings( cameraDescription, mediaSettings: MediaSettings( @@ -110,13 +114,15 @@ void main() { // Load video metadata final File videoFile = File(file.path); - final VideoPlayerController videoController = VideoPlayerController.file(videoFile); + final VideoPlayerController videoController = + VideoPlayerController.file(videoFile); await videoController.initialize(); final Size video = videoController.value.size; // Verify image dimensions are as expected expect(video, isNotNull); - return assertExpectedDimensions(expectedSize, Size(video.height, video.width)); + return assertExpectedDimensions( + expectedSize, Size(video.height, video.width)); } testWidgets( @@ -128,7 +134,8 @@ void main() { } for (final CameraDescription cameraDescription in cameras) { bool previousPresetExactlySupported = true; - for (final MapEntry preset in presetExpectedSizes.entries) { + for (final MapEntry preset + in presetExpectedSizes.entries) { final CameraController controller = CameraController.withSettings( cameraDescription, mediaSettings: MediaSettings( @@ -193,7 +200,8 @@ void main() { sleep(const Duration(milliseconds: 500)); final XFile file = await controller.stopVideoRecording(); - final int recordingTime = DateTime.now().millisecondsSinceEpoch - recordingStart; + final int recordingTime = + DateTime.now().millisecondsSinceEpoch - recordingStart; final File videoFile = File(file.path); final VideoPlayerController videoController = VideoPlayerController.file( @@ -248,8 +256,8 @@ void main() { ); /// Start streaming with specifying the ImageFormatGroup. - Future startStreaming( - List cameras, ImageFormatGroup? imageFormatGroup) async { + Future startStreaming(List cameras, + ImageFormatGroup? imageFormatGroup) async { final CameraController controller = CameraController.withSettings( cameras.first, mediaSettings: const MediaSettings( diff --git a/packages/camera/camera/example/lib/main.dart b/packages/camera/camera/example/lib/main.dart index dadb6c912c8..08cbfa6156c 100644 --- a/packages/camera/camera/example/lib/main.dart +++ b/packages/camera/camera/example/lib/main.dart @@ -138,9 +138,10 @@ class _CameraExampleHomeState extends State decoration: BoxDecoration( color: Colors.black, border: Border.all( - color: controller != null && controller!.value.isRecordingVideo - ? Colors.redAccent - : Colors.grey, + color: + controller != null && controller!.value.isRecordingVideo + ? Colors.redAccent + : Colors.grey, width: 3.0, ), ), @@ -187,12 +188,14 @@ class _CameraExampleHomeState extends State onPointerUp: (_) => _pointers--, child: CameraPreview( controller!, - child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) { + child: LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { return GestureDetector( behavior: HitTestBehavior.opaque, onScaleStart: _handleScaleStart, onScaleUpdate: _handleScaleUpdate, - onTapDown: (TapDownDetails details) => onViewFinderTap(details, constraints), + onTapDown: (TapDownDetails details) => + onViewFinderTap(details, constraints), ); }), ), @@ -210,7 +213,8 @@ class _CameraExampleHomeState extends State return; } - _currentScale = (_baseScale * details.scale).clamp(_minAvailableZoom, _maxAvailableZoom); + _currentScale = (_baseScale * details.scale) + .clamp(_minAvailableZoom, _maxAvailableZoom); await controller!.setZoomLevel(_currentScale); } @@ -237,12 +241,16 @@ class _CameraExampleHomeState extends State // pointing to a location within the browser. It may be displayed // either with Image.network or Image.memory after loading the image // bytes to memory. - kIsWeb ? Image.network(imageFile!.path) : Image.file(File(imageFile!.path))) + kIsWeb + ? Image.network(imageFile!.path) + : Image.file(File(imageFile!.path))) : Container( - decoration: BoxDecoration(border: Border.all(color: Colors.pink)), + decoration: BoxDecoration( + border: Border.all(color: Colors.pink)), child: Center( child: AspectRatio( - aspectRatio: localVideoController.value.aspectRatio, + aspectRatio: + localVideoController.value.aspectRatio, child: VideoPlayer(localVideoController)), ), ), @@ -271,12 +279,15 @@ class _CameraExampleHomeState extends State IconButton( icon: const Icon(Icons.exposure), color: Colors.blue, - onPressed: controller != null ? onExposureModeButtonPressed : null, + onPressed: controller != null + ? onExposureModeButtonPressed + : null, ), IconButton( icon: const Icon(Icons.filter_center_focus), color: Colors.blue, - onPressed: controller != null ? onFocusModeButtonPressed : null, + onPressed: + controller != null ? onFocusModeButtonPressed : null, ) ] : [], @@ -290,7 +301,9 @@ class _CameraExampleHomeState extends State ? Icons.screen_lock_rotation : Icons.screen_rotation), color: Colors.blue, - onPressed: controller != null ? onCaptureOrientationLockButtonPressed : null, + onPressed: controller != null + ? onCaptureOrientationLockButtonPressed + : null, ), ], ), @@ -310,27 +323,39 @@ class _CameraExampleHomeState extends State children: [ IconButton( icon: const Icon(Icons.flash_off), - color: controller?.value.flashMode == FlashMode.off ? Colors.orange : Colors.blue, - onPressed: - controller != null ? () => onSetFlashModeButtonPressed(FlashMode.off) : null, + color: controller?.value.flashMode == FlashMode.off + ? Colors.orange + : Colors.blue, + onPressed: controller != null + ? () => onSetFlashModeButtonPressed(FlashMode.off) + : null, ), IconButton( icon: const Icon(Icons.flash_auto), - color: controller?.value.flashMode == FlashMode.auto ? Colors.orange : Colors.blue, - onPressed: - controller != null ? () => onSetFlashModeButtonPressed(FlashMode.auto) : null, + color: controller?.value.flashMode == FlashMode.auto + ? Colors.orange + : Colors.blue, + onPressed: controller != null + ? () => onSetFlashModeButtonPressed(FlashMode.auto) + : null, ), IconButton( icon: const Icon(Icons.flash_on), - color: controller?.value.flashMode == FlashMode.always ? Colors.orange : Colors.blue, - onPressed: - controller != null ? () => onSetFlashModeButtonPressed(FlashMode.always) : null, + color: controller?.value.flashMode == FlashMode.always + ? Colors.orange + : Colors.blue, + onPressed: controller != null + ? () => onSetFlashModeButtonPressed(FlashMode.always) + : null, ), IconButton( icon: const Icon(Icons.highlight), - color: controller?.value.flashMode == FlashMode.torch ? Colors.orange : Colors.blue, - onPressed: - controller != null ? () => onSetFlashModeButtonPressed(FlashMode.torch) : null, + color: controller?.value.flashMode == FlashMode.torch + ? Colors.orange + : Colors.blue, + onPressed: controller != null + ? () => onSetFlashModeButtonPressed(FlashMode.torch) + : null, ), ], ), @@ -342,12 +367,16 @@ class _CameraExampleHomeState extends State final ButtonStyle styleAuto = TextButton.styleFrom( // TODO(darrenaustin): Migrate to new API once it lands in stable: https://github.com/flutter/flutter/issues/105724 // ignore: deprecated_member_use - primary: controller?.value.exposureMode == ExposureMode.auto ? Colors.orange : Colors.blue, + primary: controller?.value.exposureMode == ExposureMode.auto + ? Colors.orange + : Colors.blue, ); final ButtonStyle styleLocked = TextButton.styleFrom( // TODO(darrenaustin): Migrate to new API once it lands in stable: https://github.com/flutter/flutter/issues/105724 // ignore: deprecated_member_use - primary: controller?.value.exposureMode == ExposureMode.locked ? Colors.orange : Colors.blue, + primary: controller?.value.exposureMode == ExposureMode.locked + ? Colors.orange + : Colors.blue, ); return SizeTransition( @@ -366,7 +395,8 @@ class _CameraExampleHomeState extends State TextButton( style: styleAuto, onPressed: controller != null - ? () => onSetExposureModeButtonPressed(ExposureMode.auto) + ? () => + onSetExposureModeButtonPressed(ExposureMode.auto) : null, onLongPress: () { if (controller != null) { @@ -379,13 +409,16 @@ class _CameraExampleHomeState extends State TextButton( style: styleLocked, onPressed: controller != null - ? () => onSetExposureModeButtonPressed(ExposureMode.locked) + ? () => + onSetExposureModeButtonPressed(ExposureMode.locked) : null, child: const Text('LOCKED'), ), TextButton( style: styleLocked, - onPressed: controller != null ? () => controller!.setExposureOffset(0.0) : null, + onPressed: controller != null + ? () => controller!.setExposureOffset(0.0) + : null, child: const Text('RESET OFFSET'), ), ], @@ -402,7 +435,8 @@ class _CameraExampleHomeState extends State min: _minAvailableExposureOffset, max: _maxAvailableExposureOffset, label: _currentExposureOffset.toString(), - onChanged: _minAvailableExposureOffset == _maxAvailableExposureOffset + onChanged: _minAvailableExposureOffset == + _maxAvailableExposureOffset ? null : setExposureOffset, ), @@ -420,12 +454,16 @@ class _CameraExampleHomeState extends State final ButtonStyle styleAuto = TextButton.styleFrom( // TODO(darrenaustin): Migrate to new API once it lands in stable: https://github.com/flutter/flutter/issues/105724 // ignore: deprecated_member_use - primary: controller?.value.focusMode == FocusMode.auto ? Colors.orange : Colors.blue, + primary: controller?.value.focusMode == FocusMode.auto + ? Colors.orange + : Colors.blue, ); final ButtonStyle styleLocked = TextButton.styleFrom( // TODO(darrenaustin): Migrate to new API once it lands in stable: https://github.com/flutter/flutter/issues/105724 // ignore: deprecated_member_use - primary: controller?.value.focusMode == FocusMode.locked ? Colors.orange : Colors.blue, + primary: controller?.value.focusMode == FocusMode.locked + ? Colors.orange + : Colors.blue, ); return SizeTransition( @@ -496,7 +534,8 @@ class _CameraExampleHomeState extends State : null, ), IconButton( - icon: cameraController != null && cameraController.value.isRecordingPaused + icon: cameraController != null && + cameraController.value.isRecordingPaused ? const Icon(Icons.play_arrow) : const Icon(Icons.pause), color: Colors.blue, @@ -519,10 +558,12 @@ class _CameraExampleHomeState extends State ), IconButton( icon: const Icon(Icons.pause_presentation), - color: cameraController != null && cameraController.value.isPreviewPaused - ? Colors.red - : Colors.blue, - onPressed: cameraController == null ? null : onPausePreviewButtonPressed, + color: + cameraController != null && cameraController.value.isPreviewPaused + ? Colors.red + : Colors.blue, + onPressed: + cameraController == null ? null : onPausePreviewButtonPressed, ), ], ); @@ -567,7 +608,8 @@ class _CameraExampleHomeState extends State String timestamp() => DateTime.now().millisecondsSinceEpoch.toString(); void showInSnackBar(String message) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(message))); + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar(content: Text(message))); } void onViewFinderTap(TapDownDetails details, BoxConstraints constraints) { @@ -593,7 +635,8 @@ class _CameraExampleHomeState extends State } } - Future _initializeCameraController(CameraDescription cameraDescription) async { + Future _initializeCameraController( + CameraDescription cameraDescription) async { final CameraController cameraController = CameraController.withSettings( cameraDescription, mediaSettings: MediaSettings( @@ -614,7 +657,8 @@ class _CameraExampleHomeState extends State setState(() {}); } if (cameraController.value.hasError) { - showInSnackBar('Camera error ${cameraController.value.errorDescription}'); + showInSnackBar( + 'Camera error ${cameraController.value.errorDescription}'); } }); @@ -624,16 +668,19 @@ class _CameraExampleHomeState extends State // The exposure mode is currently not supported on the web. ...!kIsWeb ? >[ - cameraController - .getMinExposureOffset() - .then((double value) => _minAvailableExposureOffset = value), + cameraController.getMinExposureOffset().then( + (double value) => _minAvailableExposureOffset = value), cameraController .getMaxExposureOffset() .then((double value) => _maxAvailableExposureOffset = value) ] : >[], - cameraController.getMaxZoomLevel().then((double value) => _maxAvailableZoom = value), - cameraController.getMinZoomLevel().then((double value) => _minAvailableZoom = value), + cameraController + .getMaxZoomLevel() + .then((double value) => _maxAvailableZoom = value), + cameraController + .getMinZoomLevel() + .then((double value) => _minAvailableZoom = value), ]); } on CameraException catch (e) { switch (e.code) { diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index 6d82a0cdb19..ae582fcf7e0 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -8,9 +8,12 @@ environment: dependencies: camera: + # When depending on this package from a real application you should use: + # camera: ^x.y.z + # See https://dart.dev/tools/pub/dependencies#version-constraints + # The example app is bundled with the plugin so we use a path dependency on + # the parent directory to use the current plugin's version. path: ../ - camera_platform_interface: - path: ../../camera_platform_interface flutter: sdk: flutter path_provider: ^2.0.0 diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index e55ff100457..da6f50c9304 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -245,20 +245,38 @@ class CameraController extends ValueNotifier { /// Creates a new camera controller in an uninitialized state, using specified media settings like fps and bitrate. CameraController.withSettings( CameraDescription description, { - this.mediaSettings, + MediaSettings? mediaSettings, this.imageFormatGroup, - }) : super(CameraValue.uninitialized(description)); + }) : mediaSettings = mediaSettings ?? + const MediaSettings( + resolutionPreset: + kIsWeb ? ResolutionPreset.max : ResolutionPreset.medium, + enableAudio: true), + super(CameraValue.uninitialized(description)); /// The properties of the camera device controlled by this controller. CameraDescription get description => value.description; + /// The resolution this controller is targeting. + /// + /// This resolution preset is not guaranteed to be available on the device, + /// if unavailable a lower resolution will be used. + /// + /// See also: [ResolutionPreset]. + ResolutionPreset get resolutionPreset => + mediaSettings.resolutionPreset ?? + (kIsWeb ? ResolutionPreset.max : ResolutionPreset.medium); + + /// Whether to include audio when recording a video. + bool get enableAudio => mediaSettings.enableAudio; + /// The media settings this controller is targeting. /// /// This media settings are not guaranteed to be available on the device, /// if unavailable a lower resolution will be used. /// /// See also: [MediaSettings]. - final MediaSettings? mediaSettings; + final MediaSettings mediaSettings; /// The [ImageFormatGroup] describes the output of the raw image format. /// diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index f1a4c6ac6b1..8447cab8754 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -4,7 +4,7 @@ description: A Flutter plugin for controlling the camera. Supports previewing Dart. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.10.5+3 +version: 0.10.6 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/camera/camera/test/camera_preview_test.dart b/packages/camera/camera/test/camera_preview_test.dart index af7abcc298b..b99c1cacc64 100644 --- a/packages/camera/camera/test/camera_preview_test.dart +++ b/packages/camera/camera/test/camera_preview_test.dart @@ -9,11 +9,12 @@ import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -class FakeController extends ValueNotifier implements CameraController { +class FakeController extends ValueNotifier + implements CameraController { FakeController() : super(const CameraValue.uninitialized(fakeDescription)); - static const CameraDescription fakeDescription = - CameraDescription(name: '', lensDirection: CameraLensDirection.back, sensorOrientation: 0); + static const CameraDescription fakeDescription = CameraDescription( + name: '', lensDirection: CameraLensDirection.back, sensorOrientation: 0); @override Future dispose() async { @@ -31,6 +32,9 @@ class FakeController extends ValueNotifier implements CameraControl @override void debugCheckIsDisposed() {} + @override + bool get enableAudio => false; + @override Future getExposureOffsetStepSize() async => 1.0; @@ -61,6 +65,9 @@ class FakeController extends ValueNotifier implements CameraControl @override Future prepareForVideoRecording() async {} + @override + ResolutionPreset get resolutionPreset => ResolutionPreset.low; + @override MediaSettings get mediaSettings => const MediaSettings( resolutionPreset: ResolutionPreset.low, @@ -98,7 +105,8 @@ class FakeController extends ValueNotifier implements CameraControl Future startImageStream(onLatestImageAvailable onAvailable) async {} @override - Future startVideoRecording({onLatestImageAvailable? onAvailable}) async {} + Future startVideoRecording( + {onLatestImageAvailable? onAvailable}) async {} @override Future stopImageStream() async {} @@ -127,7 +135,9 @@ class FakeController extends ValueNotifier implements CameraControl void main() { group('RotatedBox (Android only)', () { - testWidgets('when recording rotatedBox should turn according to recording orientation', ( + testWidgets( + 'when recording rotatedBox should turn according to recording orientation', + ( WidgetTester tester, ) async { debugDefaultTargetPlatformOverride = TargetPlatform.android; @@ -138,9 +148,10 @@ void main() { isRecordingVideo: true, deviceOrientation: DeviceOrientation.portraitUp, lockedCaptureOrientation: - const Optional.fromNullable(DeviceOrientation.landscapeRight), - recordingOrientation: - const Optional.fromNullable(DeviceOrientation.landscapeLeft), + const Optional.fromNullable( + DeviceOrientation.landscapeRight), + recordingOrientation: const Optional.fromNullable( + DeviceOrientation.landscapeLeft), previewSize: const Size(480, 640), ); @@ -152,13 +163,16 @@ void main() { ); expect(find.byType(RotatedBox), findsOneWidget); - final RotatedBox rotatedBox = tester.widget(find.byType(RotatedBox)); + final RotatedBox rotatedBox = + tester.widget(find.byType(RotatedBox)); expect(rotatedBox.quarterTurns, 3); debugDefaultTargetPlatformOverride = null; }); - testWidgets('when orientation locked rotatedBox should turn according to locked orientation', ( + testWidgets( + 'when orientation locked rotatedBox should turn according to locked orientation', + ( WidgetTester tester, ) async { debugDefaultTargetPlatformOverride = TargetPlatform.android; @@ -168,9 +182,10 @@ void main() { isInitialized: true, deviceOrientation: DeviceOrientation.portraitUp, lockedCaptureOrientation: - const Optional.fromNullable(DeviceOrientation.landscapeRight), - recordingOrientation: - const Optional.fromNullable(DeviceOrientation.landscapeLeft), + const Optional.fromNullable( + DeviceOrientation.landscapeRight), + recordingOrientation: const Optional.fromNullable( + DeviceOrientation.landscapeLeft), previewSize: const Size(480, 640), ); @@ -182,7 +197,8 @@ void main() { ); expect(find.byType(RotatedBox), findsOneWidget); - final RotatedBox rotatedBox = tester.widget(find.byType(RotatedBox)); + final RotatedBox rotatedBox = + tester.widget(find.byType(RotatedBox)); expect(rotatedBox.quarterTurns, 1); debugDefaultTargetPlatformOverride = null; @@ -199,8 +215,8 @@ void main() { controller.value = controller.value.copyWith( isInitialized: true, deviceOrientation: DeviceOrientation.portraitUp, - recordingOrientation: - const Optional.fromNullable(DeviceOrientation.landscapeLeft), + recordingOrientation: const Optional.fromNullable( + DeviceOrientation.landscapeLeft), previewSize: const Size(480, 640), ); @@ -212,14 +228,16 @@ void main() { ); expect(find.byType(RotatedBox), findsOneWidget); - final RotatedBox rotatedBox = tester.widget(find.byType(RotatedBox)); + final RotatedBox rotatedBox = + tester.widget(find.byType(RotatedBox)); expect(rotatedBox.quarterTurns, 0); debugDefaultTargetPlatformOverride = null; }); }, skip: kIsWeb); - testWidgets('when not on Android there should not be a rotated box', (WidgetTester tester) async { + testWidgets('when not on Android there should not be a rotated box', + (WidgetTester tester) async { debugDefaultTargetPlatformOverride = TargetPlatform.iOS; final FakeController controller = FakeController(); controller.value = controller.value.copyWith( diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index fbd80bcb9a7..d2a7b6304ae 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -83,6 +83,17 @@ class MethodChannelCamera extends CameraPlatform { } } + @override + Future createCamera( + CameraDescription cameraDescription, + ResolutionPreset? resolutionPreset, { + bool enableAudio = false, + }) async => + createCameraWithSettings( + cameraDescription, + MediaSettings( + resolutionPreset: resolutionPreset, enableAudio: enableAudio)); + @override Future createCameraWithSettings( CameraDescription cameraDescription, From 22656defbed48ef02c9753dbd427f0d075f91907 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Wed, 21 Jun 2023 09:56:21 +0300 Subject: [PATCH 072/108] Update packages/camera/camera/lib/src/camera_controller.dart Co-authored-by: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> --- packages/camera/camera/lib/src/camera_controller.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index da6f50c9304..1c89e8e8d06 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -232,7 +232,8 @@ class CameraValue { /// To show the camera preview on the screen use a [CameraPreview] widget. class CameraController extends ValueNotifier { /// Creates a new camera controller in an uninitialized state. - /// Deprecated, use [withSettings]. + /// + /// Deprecated. Please use [withSettings]. CameraController( CameraDescription description, ResolutionPreset resolutionPreset, { From 14015909bbcede50b2b1a4fecfee0faf0a2de8f9 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Wed, 21 Jun 2023 10:04:12 +0300 Subject: [PATCH 073/108] Update packages/camera/camera_platform_interface/lib/src/types/media_settings.dart Co-authored-by: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> --- .../camera_platform_interface/lib/src/types/media_settings.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart index 833176952d1..397cfe4d174 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -29,7 +29,7 @@ class MediaSettings { /// Sets the video encoding bit rate for recording. final int? videoBitrate; - /// Sets the audio encoding bit rate for recording. + /// The audio encoding bit rate for recording. final int? audioBitrate; /// Controls audio presence in recorded video. From 0ed67df43ed755bfab6eece51f31610b45f6a339 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Wed, 21 Jun 2023 10:04:34 +0300 Subject: [PATCH 074/108] Update packages/camera/camera_platform_interface/lib/src/types/media_settings.dart Co-authored-by: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> --- .../camera_platform_interface/lib/src/types/media_settings.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart index 397cfe4d174..79026f11c37 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -26,7 +26,7 @@ class MediaSettings { /// Rate at which frames should be captured by the camera in frames per second. final int? fps; - /// Sets the video encoding bit rate for recording. + /// The video encoding bit rate for recording. final int? videoBitrate; /// The audio encoding bit rate for recording. From ff29e3f7e08e5786b5545d358c75513d44666d1e Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 21 Jun 2023 12:10:44 +0300 Subject: [PATCH 075/108] version fix --- packages/camera/camera_android_camerax/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index f9882f029a0..de10f2b76f2 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.5.0+7 +version: 0.5.0+8 environment: sdk: ">=2.19.0 <4.0.0" From 7088c8a081a7a725288fe61ef72de221f178695e Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 25 Jul 2023 09:13:08 +0300 Subject: [PATCH 076/108] Object.hash --- .../camera_web/lib/src/types/camera_options.dart | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/camera/camera_web/lib/src/types/camera_options.dart b/packages/camera/camera_web/lib/src/types/camera_options.dart index affc399e25d..4c4d9cdc6ac 100644 --- a/packages/camera/camera_web/lib/src/types/camera_options.dart +++ b/packages/camera/camera_web/lib/src/types/camera_options.dart @@ -79,7 +79,7 @@ class AudioConstraints { bitrate == other.bitrate; @override - int get hashCode => enabled.hashCode ^ bitrate.hashCode; + int get hashCode => Object.hash(enabled, bitrate); } /// Defines constraints that the video track must have @@ -128,7 +128,9 @@ class VideoConstraints { json['deviceId'] = {'exact': deviceId!}; } - json['bitrate'] = bitrate; + if (bitrate != null) { + json['bitrate'] = bitrate; + } return json; } @@ -145,12 +147,7 @@ class VideoConstraints { deviceId == other.deviceId; @override - int get hashCode => - bitrate.hashCode ^ - facingMode.hashCode ^ - width.hashCode ^ - height.hashCode ^ - deviceId.hashCode; + int get hashCode => Object.hash(bitrate, facingMode, width, height, deviceId); } /// The camera type used in [FacingModeConstraint]. From 85d6f2056c1c0474faa014859122fcf2916b940d Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 25 Jul 2023 09:21:56 +0300 Subject: [PATCH 077/108] bump gradle version moved to last entry changelog entry --- packages/camera/camera_android/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index ed35d6d70cb..e6903166d91 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.10.8+5 * Adds support to control video fps and bitrate. See `CameraController.withSettings`. +* Bump: `com.android.tools.build:gradle:7.2.0` ## 0.10.8+4 @@ -37,7 +38,6 @@ ## 0.10.6+1 * Adds a namespace for compatibility with AGP 8.0. -* Bump: `com.android.tools.build:gradle:7.2.0` ## 0.10.6 From 597dcc2619926be86a58964fa2531d571a8fc7fa Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 25 Jul 2023 15:26:55 +0300 Subject: [PATCH 078/108] fixed format and analyzer issues --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 6 +----- .../test/android_camera_camerax_test.dart | 1 + 2 files changed, 2 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 99c0f5e7139..69e38b77381 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 @@ -282,11 +282,7 @@ private void prepareMediaRecorder(String outputFilePath) throws IOException { if (SdkCapabilityChecker.supportsEncoderProfiles() && recordingProfile != null) { mediaRecorderBuilder = new MediaRecorderBuilder( - recordingProfile, - outputFilePath, - getFps(), - getVideoBitrate(), - getAudioBitrate()); + recordingProfile, outputFilePath, getFps(), getVideoBitrate(), getAudioBitrate()); } else { mediaRecorderBuilder = new MediaRecorderBuilder( 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 292e4b7659e..1b2fde4dd4d 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 @@ -1047,6 +1047,7 @@ void main() { imageDataCompleter.complete(imageData); }); + // ignore: unused_local_variable final Analyzer capturedAnalyzer = verify(camera.mockImageAnalysis.setAnalyzer(captureAny)).captured.single as Analyzer; From c1bac8b3445b35a2796bc4f8550d105fcb8c702c Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 25 Jul 2023 15:35:09 +0300 Subject: [PATCH 079/108] reverted merge for onStreamedFrameAvailable test --- .../test/android_camera_camerax_test.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 1b2fde4dd4d..95bd43d7563 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 @@ -1047,7 +1047,7 @@ void main() { imageDataCompleter.complete(imageData); }); - // ignore: unused_local_variable + // Test ImageAnalysis use case is bound to ProcessCameraProvider. final Analyzer capturedAnalyzer = verify(camera.mockImageAnalysis.setAnalyzer(captureAny)).captured.single as Analyzer; @@ -1056,6 +1056,8 @@ void main() { await untilCalled(mockProcessCameraProvider.bindToLifecycle( mockCameraSelector, [camera.mockImageAnalysis])); + await capturedAnalyzer.analyze(mockImageProxy); + final CameraImageData imageData = await imageDataCompleter.future; // Test Analyzer correctly process ImageProxy instances. From d7bc0be02ff228e4cb0daf56a5b63d36f362799a Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Fri, 4 Aug 2023 08:04:42 +0300 Subject: [PATCH 080/108] camsim99 requests to remove gradle upgrade --- .../camera_android/example/android/settings.gradle | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/camera/camera_android/example/android/settings.gradle b/packages/camera/camera_android/example/android/settings.gradle index 5d487c90509..6cb349eef1b 100644 --- a/packages/camera/camera_android/example/android/settings.gradle +++ b/packages/camera/camera_android/example/android/settings.gradle @@ -1,15 +1,5 @@ include ':app' -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() - -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } - -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" - def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() def plugins = new Properties() From ea1777a6d845cc0d662793802d3b39a2824d5a64 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Fri, 4 Aug 2023 08:28:37 +0300 Subject: [PATCH 081/108] added safety checks for preview. --- packages/camera/camera/lib/src/camera_preview.dart | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/camera/camera/lib/src/camera_preview.dart b/packages/camera/camera/lib/src/camera_preview.dart index f081a1fa2db..1ab61bc2d66 100644 --- a/packages/camera/camera/lib/src/camera_preview.dart +++ b/packages/camera/camera/lib/src/camera_preview.dart @@ -21,18 +21,20 @@ class CameraPreview extends StatelessWidget { @override Widget build(BuildContext context) { - return (controller.value.isInitialized && !controller.value.isPreviewPaused) + return controller.value.isInitialized ? ValueListenableBuilder( valueListenable: controller, builder: (BuildContext context, Object? value, Widget? child) { return AspectRatio( - aspectRatio: _isLandscape() - ? controller.value.aspectRatio - : (1 / controller.value.aspectRatio), + aspectRatio: controller.value.isInitialized + ? (_isLandscape() + ? controller.value.aspectRatio + : (1 / controller.value.aspectRatio)) + : 1, child: Stack( fit: StackFit.expand, children: [ - if (!controller.value.isPreviewPaused) + if (controller.value.isInitialized) _wrapInRotatedBox(child: controller.buildPreview()), child ?? Container(), ], From 8e14f0d352aa1ebc9a3bfafd449538b33b68c1d8 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Fri, 4 Aug 2023 08:47:47 +0300 Subject: [PATCH 082/108] version check --- packages/camera/camera_web/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 0611acb2c31..a6dd5bf7880 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_web description: A Flutter plugin for getting information about and controlling the camera on Web. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.3.3 +version: 0.3.2+1 environment: sdk: ">=2.18.0 <4.0.0" From ea9e49e4ce0a9b945da02b0b32fa5ce409b3b62d Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Mon, 14 Aug 2023 12:23:35 +0300 Subject: [PATCH 083/108] merged --- packages/camera/camera/CHANGELOG.md | 4 +--- packages/camera/camera/pubspec.yaml | 4 ---- packages/camera/camera_android/CHANGELOG.md | 8 ++++---- .../camera_android/example/android/settings.gradle | 4 ---- packages/camera/camera_android/pubspec.yaml | 6 +----- packages/camera/camera_android_camerax/CHANGELOG.md | 9 +++++---- packages/camera/camera_android_camerax/pubspec.yaml | 2 +- 7 files changed, 12 insertions(+), 25 deletions(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index f729cf6745d..a4a4142b2bc 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,12 +1,10 @@ -<<<<<<< HEAD ## 0.10.6 * Adds support to control video fps and bitrate. See `CameraController.withSettings`. -======= + ## 0.10.5+3 * Migrates `styleFrom` usage in examples off of deprecated `primary` and `onPrimary` parameters. ->>>>>>> upstream/main ## 0.10.5+2 diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index f44aeb4f125..f08c8f68d7e 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -4,11 +4,7 @@ description: A Flutter plugin for controlling the camera. Supports previewing Dart. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -<<<<<<< HEAD version: 0.10.6 -======= -version: 0.10.5+3 ->>>>>>> upstream/main environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index e701aa3abd4..7ac55a740f6 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,10 +1,10 @@ -## 0.10.8+6 +## 0.10.8+7 -<<<<<<< HEAD * Adds support to control video fps and bitrate. See `CameraController.withSettings`. -======= + +## 0.10.8+6 +* * Migrates `styleFrom` usage in examples off of deprecated `primary` and `onPrimary` parameters. ->>>>>>> upstream/main ## 0.10.8+5 diff --git a/packages/camera/camera_android/example/android/settings.gradle b/packages/camera/camera_android/example/android/settings.gradle index ea173b8edd1..0360c9f26f6 100644 --- a/packages/camera/camera_android/example/android/settings.gradle +++ b/packages/camera/camera_android/example/android/settings.gradle @@ -12,9 +12,6 @@ plugins.each { name, path -> def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() include ":$name" project(":$name").projectDir = pluginDirectory -<<<<<<< HEAD -} -======= } // See https://github.com/flutter/flutter/wiki/Plugins-and-Packages-repository-structure#gradle-structure for more info. @@ -29,4 +26,3 @@ buildscript { } } apply plugin: "com.google.cloud.artifactregistry.gradle-plugin" ->>>>>>> upstream/main diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 988bad560b0..a2f48618025 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -2,11 +2,7 @@ name: camera_android 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 -<<<<<<< HEAD -======= - ->>>>>>> upstream/main -version: 0.10.8+6 +version: 0.10.8+7 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 0d80c7f9c45..4c6ff0ffc85 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,10 +1,11 @@ -## 0.5.0+13 +## 0.5.0+14 -<<<<<<< HEAD * Adds support to control video fps and bitrate. See `CameraController.withSettings`. -======= + +## 0.5.0+13 +* * Migrates `styleFrom` usage in examples off of deprecated `primary` and `onPrimary` parameters. ->>>>>>> upstream/main + ## 0.5.0+12 diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index c169bdda3c4..1733bdc5184 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.5.0+13 +version: 0.5.0+14 environment: sdk: ">=2.19.0 <4.0.0" From aa6cc8b583c2212875b100b2cf92b781bc926329 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Tue, 15 Aug 2023 18:59:01 +0300 Subject: [PATCH 084/108] Update packages/camera/camera_android/CHANGELOG.md Co-authored-by: Camille Simon <43054281+camsim99@users.noreply.github.com> --- packages/camera/camera_android/CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index 7ac55a740f6..836ee015702 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -3,7 +3,6 @@ * Adds support to control video fps and bitrate. See `CameraController.withSettings`. ## 0.10.8+6 -* * Migrates `styleFrom` usage in examples off of deprecated `primary` and `onPrimary` parameters. ## 0.10.8+5 From 8d5a701a7b462fdcd2ee35c95d748ced0a115b46 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Mon, 14 Aug 2023 11:47:06 -0700 Subject: [PATCH 085/108] [file_selector] Fix default accept types on iOS (#4691) Uses `public.data` as the default accept type on iOS, instead of an empty list, since unlike on macOS an empty list of accept types doesn't mean to accept every type, so the default on iOS was not allowing any files. Adds another page to the implementation package's example app to facilitate manual testing of this behavior for package developers. Fixes https://github.com/flutter/flutter/issues/132211 --- .../file_selector_ios/CHANGELOG.md | 3 +- .../example/lib/home_page.dart | 6 ++ .../file_selector_ios/example/lib/main.dart | 2 + .../example/lib/open_any_page.dart | 78 +++++++++++++++++++ .../lib/file_selector_ios.dart | 8 +- .../file_selector_ios/pubspec.yaml | 2 +- .../test/file_selector_ios_test.dart | 29 ++++++- 7 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 packages/file_selector/file_selector_ios/example/lib/open_any_page.dart diff --git a/packages/file_selector/file_selector_ios/CHANGELOG.md b/packages/file_selector/file_selector_ios/CHANGELOG.md index f8527d6bc19..52268b8d45d 100644 --- a/packages/file_selector/file_selector_ios/CHANGELOG.md +++ b/packages/file_selector/file_selector_ios/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.5.1+5 +* Fixes the behavior of no type groups to allow selecting any file. * Migrates `styleFrom` usage in examples off of deprecated `primary` and `onPrimary` parameters. ## 0.5.1+4 diff --git a/packages/file_selector/file_selector_ios/example/lib/home_page.dart b/packages/file_selector/file_selector_ios/example/lib/home_page.dart index 29837b4eb81..22d55f07623 100644 --- a/packages/file_selector/file_selector_ios/example/lib/home_page.dart +++ b/packages/file_selector/file_selector_ios/example/lib/home_page.dart @@ -35,6 +35,12 @@ class HomePage extends StatelessWidget { onPressed: () => Navigator.pushNamed(context, '/open/image'), ), const SizedBox(height: 10), + ElevatedButton( + style: style, + child: const Text('Open any file'), + onPressed: () => Navigator.pushNamed(context, '/open/any'), + ), + const SizedBox(height: 10), ElevatedButton( style: style, child: const Text('Open multiple images'), diff --git a/packages/file_selector/file_selector_ios/example/lib/main.dart b/packages/file_selector/file_selector_ios/example/lib/main.dart index 00641de1671..1f3508a149e 100644 --- a/packages/file_selector/file_selector_ios/example/lib/main.dart +++ b/packages/file_selector/file_selector_ios/example/lib/main.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'home_page.dart'; +import 'open_any_page.dart'; import 'open_image_page.dart'; import 'open_multiple_images_page.dart'; import 'open_text_page.dart'; @@ -32,6 +33,7 @@ class MyApp extends StatelessWidget { '/open/images': (BuildContext context) => const OpenMultipleImagesPage(), '/open/text': (BuildContext context) => const OpenTextPage(), + '/open/any': (BuildContext context) => const OpenAnyPage(), }, ); } diff --git a/packages/file_selector/file_selector_ios/example/lib/open_any_page.dart b/packages/file_selector/file_selector_ios/example/lib/open_any_page.dart new file mode 100644 index 00000000000..7b672179185 --- /dev/null +++ b/packages/file_selector/file_selector_ios/example/lib/open_any_page.dart @@ -0,0 +1,78 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; +import 'package:flutter/material.dart'; + +/// Screen that allows the user to select any file file using `openFile`, then +/// displays its path in a dialog. +class OpenAnyPage extends StatelessWidget { + /// Default Constructor + const OpenAnyPage({super.key}); + + Future _openTextFile(BuildContext context) async { + final XFile? file = await FileSelectorPlatform.instance.openFile(); + if (file == null) { + // Operation was canceled by the user. + return; + } + + if (context.mounted) { + await showDialog( + context: context, + builder: (BuildContext context) => PathDisplay(file.name, file.path), + ); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Open a file'), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blue, + foregroundColor: Colors.white, + ), + child: const Text('Press to open a file of any type'), + onPressed: () => _openTextFile(context), + ), + ], + ), + ), + ); + } +} + +/// Widget that displays a text file in a dialog. +class PathDisplay extends StatelessWidget { + /// Default Constructor. + const PathDisplay(this.fileName, this.filePath, {super.key}); + + /// The name of the selected file. + final String fileName; + + /// The contents of the text file. + final String filePath; + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(fileName), + content: Text(filePath), + actions: [ + TextButton( + child: const Text('Close'), + onPressed: () => Navigator.pop(context), + ), + ], + ); + } +} diff --git a/packages/file_selector/file_selector_ios/lib/file_selector_ios.dart b/packages/file_selector/file_selector_ios/lib/file_selector_ios.dart index 22349b6232e..3c2e4a2b8a9 100644 --- a/packages/file_selector/file_selector_ios/lib/file_selector_ios.dart +++ b/packages/file_selector/file_selector_ios/lib/file_selector_ios.dart @@ -44,14 +44,18 @@ class FileSelectorIOS extends FileSelectorPlatform { // Converts the type group list into a list of all allowed UTIs, since // iOS doesn't support filter groups. List _allowedUtiListFromTypeGroups(List? typeGroups) { + // iOS requires a list of allowed types, so allowing all is expressed via + // a root type rather than an empty list. + const List allowAny = ['public.data']; + if (typeGroups == null || typeGroups.isEmpty) { - return []; + return allowAny; } final List allowedUTIs = []; for (final XTypeGroup typeGroup in typeGroups) { // If any group allows everything, no filtering should be done. if (typeGroup.allowsAny) { - return []; + return allowAny; } if (typeGroup.uniformTypeIdentifiers?.isEmpty ?? true) { throw ArgumentError('The provided type group $typeGroup should either ' diff --git a/packages/file_selector/file_selector_ios/pubspec.yaml b/packages/file_selector/file_selector_ios/pubspec.yaml index dd3f7dfca53..9470e75678c 100644 --- a/packages/file_selector/file_selector_ios/pubspec.yaml +++ b/packages/file_selector/file_selector_ios/pubspec.yaml @@ -2,7 +2,7 @@ name: file_selector_ios description: iOS implementation of the file_selector plugin. repository: https://github.com/flutter/packages/tree/main/packages/file_selector/file_selector_ios issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+file_selector%22 -version: 0.5.1+4 +version: 0.5.1+5 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/file_selector/file_selector_ios/test/file_selector_ios_test.dart b/packages/file_selector/file_selector_ios/test/file_selector_ios_test.dart index 6d3c3c684ca..9c065f3bd1e 100644 --- a/packages/file_selector/file_selector_ios/test/file_selector_ios_test.dart +++ b/packages/file_selector/file_selector_ios/test/file_selector_ios_test.dart @@ -72,13 +72,25 @@ void main() { throwsArgumentError); }); - test('allows a wildcard group', () async { + test('correctly handles no type groups', () async { + await expectLater(plugin.openFile(), completes); + final VerificationResult result = verify(mockApi.openFile(captureAny)); + final FileSelectorConfig config = + result.captured[0] as FileSelectorConfig; + expect(listEquals(config.utis, ['public.data']), isTrue); + }); + + test('correctly handles a wildcard group', () async { const XTypeGroup group = XTypeGroup( label: 'text', ); await expectLater( plugin.openFile(acceptedTypeGroups: [group]), completes); + final VerificationResult result = verify(mockApi.openFile(captureAny)); + final FileSelectorConfig config = + result.captured[0] as FileSelectorConfig; + expect(listEquals(config.utis, ['public.data']), isTrue); }); }); @@ -113,6 +125,7 @@ void main() { isTrue); expect(config.allowMultiSelection, isTrue); }); + test('throws for a type group that does not support iOS', () async { const XTypeGroup group = XTypeGroup( label: 'images', @@ -124,13 +137,25 @@ void main() { throwsArgumentError); }); - test('allows a wildcard group', () async { + test('correctly handles no type groups', () async { + await expectLater(plugin.openFiles(), completes); + final VerificationResult result = verify(mockApi.openFile(captureAny)); + final FileSelectorConfig config = + result.captured[0] as FileSelectorConfig; + expect(listEquals(config.utis, ['public.data']), isTrue); + }); + + test('correctly handles a wildcard group', () async { const XTypeGroup group = XTypeGroup( label: 'text', ); await expectLater( plugin.openFiles(acceptedTypeGroups: [group]), completes); + final VerificationResult result = verify(mockApi.openFile(captureAny)); + final FileSelectorConfig config = + result.captured[0] as FileSelectorConfig; + expect(listEquals(config.utis, ['public.data']), isTrue); }); }); } From 97abc1b105549f2a65a4c81b73711263f8dc754d Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 15 Aug 2023 19:36:44 +0300 Subject: [PATCH 086/108] merged --- packages/camera/camera_android/CHANGELOG.md | 1 + packages/camera/camera_android_camerax/android/build.gradle | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index 836ee015702..9014bb70742 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -3,6 +3,7 @@ * Adds support to control video fps and bitrate. See `CameraController.withSettings`. ## 0.10.8+6 + * Migrates `styleFrom` usage in examples off of deprecated `primary` and `onPrimary` parameters. ## 0.10.8+5 diff --git a/packages/camera/camera_android_camerax/android/build.gradle b/packages/camera/camera_android_camerax/android/build.gradle index 486115c2176..5530a3bb104 100644 --- a/packages/camera/camera_android_camerax/android/build.gradle +++ b/packages/camera/camera_android_camerax/android/build.gradle @@ -8,7 +8,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.2.0' + classpath 'com.android.tools.build:gradle:7.3.0' } } From 2d7ec3d97c14e7717a25c087f71f00ad260a6609 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 15 Aug 2023 20:24:59 +0300 Subject: [PATCH 087/108] 7.3.0 --- packages/camera/camera_android/android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android/android/build.gradle b/packages/camera/camera_android/android/build.gradle index 0f68d74a908..6f4e19285ed 100644 --- a/packages/camera/camera_android/android/build.gradle +++ b/packages/camera/camera_android/android/build.gradle @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.2.0' + classpath 'com.android.tools.build:gradle:7.3.0' } } From def599e26f5b064f8d08af925c94149c64ecad19 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 15 Aug 2023 20:26:16 +0300 Subject: [PATCH 088/108] 7.4.2 --- packages/camera/camera_android/android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android/android/build.gradle b/packages/camera/camera_android/android/build.gradle index 6f4e19285ed..bd9711f3d46 100644 --- a/packages/camera/camera_android/android/build.gradle +++ b/packages/camera/camera_android/android/build.gradle @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' + classpath 'com.android.tools.build:gradle:7.4.2' } } From 14993b5f25662830b817d7c457878094c97ce232 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Mon, 4 Sep 2023 11:47:03 +0300 Subject: [PATCH 089/108] yaml: topics --- packages/camera/camera/pubspec.yaml | 4 +--- packages/camera/camera_android/pubspec.yaml | 4 +--- packages/camera/camera_android_camerax/pubspec.yaml | 4 +--- packages/camera/camera_avfoundation/pubspec.yaml | 4 +--- packages/camera/camera_web/pubspec.yaml | 4 +--- packages/camera/camera_windows/pubspec.yaml | 4 +--- 6 files changed, 6 insertions(+), 18 deletions(-) diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index b37b46398b1..9800407a9b8 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -38,7 +38,6 @@ dev_dependencies: plugin_platform_interface: ^2.0.0 video_player: ^2.0.0 -<<<<<<< HEAD # TODO: for PR # FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. @@ -53,7 +52,6 @@ dependency_overrides: path: ../../camera/camera_platform_interface camera_web: path: ../../camera/camera_web -======= + topics: - camera ->>>>>>> upstream/main diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 26243a144cc..eaedeb691b5 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -30,7 +30,6 @@ dev_dependencies: flutter_test: sdk: flutter -<<<<<<< HEAD # TODO: for PR # FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. @@ -39,7 +38,6 @@ dependency_overrides: camera_platform_interface: path: ../../camera/camera_platform_interface -======= + topics: - camera ->>>>>>> upstream/main diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index a601dcdd36b..09c769d5bc4 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -35,7 +35,6 @@ dev_dependencies: mockito: 5.4.1 pigeon: ^9.1.0 -<<<<<<< HEAD # TODO: for PR # FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. @@ -44,7 +43,6 @@ dependency_overrides: camera_platform_interface: path: ../../camera/camera_platform_interface -======= + topics: - camera ->>>>>>> upstream/main diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index cb265d7b713..88bcbc97075 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -28,7 +28,6 @@ dev_dependencies: flutter_test: sdk: flutter -<<<<<<< HEAD # TODO: for PR # FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. @@ -37,7 +36,6 @@ dependency_overrides: camera_platform_interface: path: ../../camera/camera_platform_interface -======= + topics: - camera ->>>>>>> upstream/main diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 81b7dc7d7b5..7d4baa5f105 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -29,7 +29,6 @@ dev_dependencies: flutter_test: sdk: flutter -<<<<<<< HEAD # TODO: for PR # FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. @@ -38,7 +37,6 @@ dependency_overrides: camera_platform_interface: path: ../../camera/camera_platform_interface -======= + topics: - camera ->>>>>>> upstream/main diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index c24de54e02b..bf726781440 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -29,7 +29,6 @@ dev_dependencies: flutter_test: sdk: flutter -<<<<<<< HEAD # TODO: for PR # FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. @@ -38,7 +37,6 @@ dependency_overrides: camera_platform_interface: path: ../../camera/camera_platform_interface -======= + topics: - camera ->>>>>>> upstream/main From 18be71cbcb02cde1f97e517c75c1f06fcc1fe02c Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Mon, 4 Sep 2023 11:55:29 +0300 Subject: [PATCH 090/108] touch --- packages/camera/camera_platform_interface/pubspec.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index b0c3a1d8bff..5e93e0423e8 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -2,6 +2,7 @@ name: camera_platform_interface description: A common platform interface for the camera plugin. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_platform_interface issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 + # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes version: 2.6.0 From b1444666c3c732f1466b5f5b7660b39c215e3788 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Tue, 19 Sep 2023 08:33:31 +0300 Subject: [PATCH 091/108] Update packages/camera/camera_web/lib/src/camera.dart Co-authored-by: David Iglesias --- packages/camera/camera_web/lib/src/camera.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_web/lib/src/camera.dart b/packages/camera/camera_web/lib/src/camera.dart index 60fe76bc1b2..57453b36018 100644 --- a/packages/camera/camera_web/lib/src/camera.dart +++ b/packages/camera/camera_web/lib/src/camera.dart @@ -448,9 +448,9 @@ class Camera { mediaRecorder ??= html.MediaRecorder(videoElement.srcObject!, { 'mimeType': _videoMimeType, - if (null != options.audio.bitrate) + if (options.audio.bitrate != null) 'audioBitsPerSecond': options.audio.bitrate!, - if (null != options.video.bitrate) + if (options.video.bitrate != null) 'videoBitsPerSecond': options.video.bitrate!, }); From c7140d506c452e294736d091fa980cb53eac42cf Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Tue, 19 Sep 2023 09:26:17 +0300 Subject: [PATCH 092/108] Update packages/camera/camera_web/lib/src/camera_service.dart Co-authored-by: David Iglesias --- packages/camera/camera_web/lib/src/camera_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_web/lib/src/camera_service.dart b/packages/camera/camera_web/lib/src/camera_service.dart index d1b1b008763..aaf2155aa5b 100644 --- a/packages/camera/camera_web/lib/src/camera_service.dart +++ b/packages/camera/camera_web/lib/src/camera_service.dart @@ -337,7 +337,7 @@ class CameraService { case ResolutionPreset.medium: return 48000; case ResolutionPreset.low: - return 320000; + return 32000; } } From 541b30765fda9315eb0f0be8eb1c6eec16c8d428 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 19 Sep 2023 12:35:26 +0300 Subject: [PATCH 093/108] tested --- .../camera/lib/src/camera_controller.dart | 3 +- .../io/flutter/plugins/camera/Camera.java | 15 ++++++---- .../integration_test/camera_options_test.dart | 4 +-- .../camera/camera_web/lib/src/camera.dart | 22 ++++++++------ .../camera_web/lib/src/camera_service.dart | 29 ++++++++++--------- .../camera/camera_web/lib/src/camera_web.dart | 9 +++--- .../lib/src/types/camera_options.dart | 24 ++++----------- 7 files changed, 51 insertions(+), 55 deletions(-) diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index 1c89e8e8d06..51c80b4cd14 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -560,7 +560,8 @@ class CameraController extends ValueNotifier { recordingOrientation: Optional.of( value.lockedCaptureOrientation ?? value.deviceOrientation), isStreamingImages: onAvailable != null); - } on PlatformException catch (e) { + } on PlatformException catch (e, st) { + print(st); throw CameraException(e.code, e.message); } } 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 69e38b77381..821f92c33d5 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 @@ -1056,16 +1056,19 @@ EncoderProfiles getRecordingProfile() { return cameraFeatures.getResolution().getRecordingProfile(); } - int getFps() { - return cameraFeatures.getFps().getValue(); + Integer getFps() { + IntFeature fpsFeature = cameraFeatures.getFps(); + return fpsFeature == null ? null : fpsFeature.getValue(); } - int getVideoBitrate() { - return cameraFeatures.getVideoBitrate().getValue(); + Integer getVideoBitrate() { + IntFeature videoBitrateFeature = cameraFeatures.getVideoBitrate(); + return videoBitrateFeature == null ? null : videoBitrateFeature.getValue(); } - int getAudioBitrate() { - return cameraFeatures.getAudioBitrate().getValue(); + Integer getAudioBitrate() { + IntFeature audioBitrateFeature = cameraFeatures.getAudioBitrate(); + return audioBitrateFeature == null ? null : audioBitrateFeature.getValue(); } /** Shortut to get deviceOrientationListener. */ diff --git a/packages/camera/camera_web/example/integration_test/camera_options_test.dart b/packages/camera/camera_web/example/integration_test/camera_options_test.dart index 2389b386380..6fa10222637 100644 --- a/packages/camera/camera_web/example/integration_test/camera_options_test.dart +++ b/packages/camera/camera_web/example/integration_test/camera_options_test.dart @@ -60,7 +60,7 @@ void main() { group('AudioConstraints', () { testWidgets('serializes correctly', (WidgetTester tester) async { expect( - const AudioConstraints(enabled: true, bitrate: 28000).toJson(), + const AudioConstraints(enabled: true).toJson(), equals({ 'enabled': true, 'bitrate': 28000, @@ -83,7 +83,6 @@ void main() { width: const VideoSizeConstraint(ideal: 100, maximum: 100), height: const VideoSizeConstraint(ideal: 50, maximum: 50), deviceId: 'deviceId', - bitrate: 250000, ); expect( @@ -92,7 +91,6 @@ void main() { 'facingMode': videoConstraints.facingMode!.toJson(), 'width': videoConstraints.width!.toJson(), 'height': videoConstraints.height!.toJson(), - 'bitrate': videoConstraints.bitrate!, 'deviceId': { 'exact': 'deviceId', } diff --git a/packages/camera/camera_web/lib/src/camera.dart b/packages/camera/camera_web/lib/src/camera.dart index 57453b36018..b609275cfc4 100644 --- a/packages/camera/camera_web/lib/src/camera.dart +++ b/packages/camera/camera_web/lib/src/camera.dart @@ -41,11 +41,12 @@ class Camera { /// Creates a new instance of [Camera] /// with the given [textureId] and optional /// [options] and [window]. - Camera({ - required this.textureId, - required CameraService cameraService, - this.options = const CameraOptions(), - }) : _cameraService = cameraService; + Camera( + {required this.textureId, + required CameraService cameraService, + this.options = const CameraOptions(), + this.recorderOptions = const (audioBitrate: null, videoBitrate: null)}) + : _cameraService = cameraService; // A torch mode constraint name. // See: https://w3c.github.io/mediacapture-image/#dom-mediatracksupportedconstraints-torch @@ -57,6 +58,9 @@ class Camera { /// The camera options used to initialize a camera, empty by default. final CameraOptions options; + /// The options used to initialize a MediaRecorder. + final ({int? audioBitrate, int? videoBitrate}) recorderOptions; + /// The video element that displays the camera stream. /// Initialized in [initialize]. late final html.VideoElement videoElement; @@ -448,10 +452,10 @@ class Camera { mediaRecorder ??= html.MediaRecorder(videoElement.srcObject!, { 'mimeType': _videoMimeType, - if (options.audio.bitrate != null) - 'audioBitsPerSecond': options.audio.bitrate!, - if (options.video.bitrate != null) - 'videoBitsPerSecond': options.video.bitrate!, + if (recorderOptions.audioBitrate != null) + 'audioBitsPerSecond': recorderOptions.audioBitrate!, + if (recorderOptions.videoBitrate != null) + 'videoBitsPerSecond': recorderOptions.videoBitrate!, }); _videoAvailableCompleter = Completer(); diff --git a/packages/camera/camera_web/lib/src/camera_service.dart b/packages/camera/camera_web/lib/src/camera_service.dart index aaf2155aa5b..f475022642e 100644 --- a/packages/camera/camera_web/lib/src/camera_service.dart +++ b/packages/camera/camera_web/lib/src/camera_service.dart @@ -101,14 +101,14 @@ class CameraService { throw CameraWebException( cameraId, CameraErrorCode.unknown, - 'An unknown error occured when fetching the camera stream.', + 'An unknown error occurred when fetching the camera stream.', ); } } catch (_) { throw CameraWebException( cameraId, CameraErrorCode.unknown, - 'An unknown error occured when fetching the camera stream.', + 'An unknown error occurred when fetching the camera stream.', ); } } @@ -224,7 +224,7 @@ class CameraService { // The method may not be supported on Firefox. // See: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/getCapabilities#browser_compatibility if (!jsUtil.hasProperty(videoTrack, 'getCapabilities')) { - // Return null if the video track capabilites are not supported. + // Return null if the video track capabilities are not supported. return null; } @@ -307,20 +307,23 @@ class CameraService { return const Size(320, 240); } + static const int _K = 1000; + static const int _M = _K * _K; + /// Maps the given [resolutionPreset] to video bitrate. int mapResolutionPresetToVideoBitrate(ResolutionPreset resolutionPreset) { switch (resolutionPreset) { case ResolutionPreset.max: case ResolutionPreset.ultraHigh: - return 8000000; + return 8 * _M; case ResolutionPreset.veryHigh: - return 4000000; + return 4 * _M; case ResolutionPreset.high: - return 1000000; + return 1 * _M; case ResolutionPreset.medium: - return 400000; + return 400 * _K; case ResolutionPreset.low: - return 200000; + return 200 * _K; } } @@ -329,15 +332,15 @@ class CameraService { switch (resolutionPreset) { case ResolutionPreset.max: case ResolutionPreset.ultraHigh: - return 128000; + return 128 * _K; case ResolutionPreset.veryHigh: - return 128000; + return 128 * _K; case ResolutionPreset.high: - return 64000; + return 64 * _K; case ResolutionPreset.medium: - return 48000; + return 48 * _K; case ResolutionPreset.low: - return 32000; + return 32 * _K; } } diff --git a/packages/camera/camera_web/lib/src/camera_web.dart b/packages/camera/camera_web/lib/src/camera_web.dart index d01bf176054..491d27c6639 100644 --- a/packages/camera/camera_web/lib/src/camera_web.dart +++ b/packages/camera/camera_web/lib/src/camera_web.dart @@ -225,11 +225,8 @@ class CameraPlugin extends CameraPlatform { textureId: textureId, cameraService: _cameraService, options: CameraOptions( - audio: AudioConstraints( - enabled: mediaSettings?.enableAudio ?? true, - bitrate: mediaSettings?.audioBitrate), + audio: AudioConstraints(enabled: mediaSettings?.enableAudio ?? true), video: VideoConstraints( - bitrate: mediaSettings?.videoBitrate, facingMode: cameraType != null ? FacingModeConstraint(cameraType) : null, width: VideoSizeConstraint( @@ -241,6 +238,10 @@ class CameraPlugin extends CameraPlatform { deviceId: cameraMetadata.deviceId, ), ), + recorderOptions: ( + audioBitrate: mediaSettings?.audioBitrate, + videoBitrate: mediaSettings?.videoBitrate, + ), ); cameras[textureId] = camera; diff --git a/packages/camera/camera_web/lib/src/types/camera_options.dart b/packages/camera/camera_web/lib/src/types/camera_options.dart index 4c4d9cdc6ac..dd36a7273e8 100644 --- a/packages/camera/camera_web/lib/src/types/camera_options.dart +++ b/packages/camera/camera_web/lib/src/types/camera_options.dart @@ -58,28 +58,23 @@ class CameraOptions { class AudioConstraints { /// Creates a new instance of [AudioConstraints] /// with the given [enabled] constraint. - const AudioConstraints({this.bitrate, this.enabled = false}); + const AudioConstraints({this.enabled = false}); /// Whether the audio track should be enabled. final bool enabled; - /// Audio bitrate - final int? bitrate; - /// Converts the current instance to a Map. - Map toJson() => - {'enabled': enabled, 'bitrate': bitrate}; + Map toJson() => {'enabled': enabled}; @override bool operator ==(Object other) => identical(this, other) || other is AudioConstraints && runtimeType == other.runtimeType && - enabled == other.enabled && - bitrate == other.bitrate; + enabled == other.enabled; @override - int get hashCode => Object.hash(enabled, bitrate); + int get hashCode => enabled.hashCode; } /// Defines constraints that the video track must have @@ -89,16 +84,12 @@ class VideoConstraints { /// Creates a new instance of [VideoConstraints] /// with the given constraints. const VideoConstraints({ - this.bitrate, this.facingMode, this.width, this.height, this.deviceId, }); - /// Video bitrate - final int? bitrate; - /// The facing mode of the video track. final FacingModeConstraint? facingMode; @@ -128,10 +119,6 @@ class VideoConstraints { json['deviceId'] = {'exact': deviceId!}; } - if (bitrate != null) { - json['bitrate'] = bitrate; - } - return json; } @@ -140,14 +127,13 @@ class VideoConstraints { identical(this, other) || other is VideoConstraints && runtimeType == other.runtimeType && - bitrate == other.bitrate && facingMode == other.facingMode && width == other.width && height == other.height && deviceId == other.deviceId; @override - int get hashCode => Object.hash(bitrate, facingMode, width, height, deviceId); + int get hashCode => Object.hash(facingMode, width, height, deviceId); } /// The camera type used in [FacingModeConstraint]. From 9776de32b0a7ef51f711906f61ce63aea872d428 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 19 Sep 2023 12:47:22 +0300 Subject: [PATCH 094/108] analyzed --- packages/camera/camera/lib/src/camera_controller.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index 51c80b4cd14..1c89e8e8d06 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -560,8 +560,7 @@ class CameraController extends ValueNotifier { recordingOrientation: Optional.of( value.lockedCaptureOrientation ?? value.deviceOrientation), isStreamingImages: onAvailable != null); - } on PlatformException catch (e, st) { - print(st); + } on PlatformException catch (e) { throw CameraException(e.code, e.message); } } From a1bf2a0027b5f4010e83fc3c61afcc0d5a50f350 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Tue, 19 Sep 2023 13:00:08 +0300 Subject: [PATCH 095/108] audio bitrate constraints removed from test --- .../camera_web/example/integration_test/camera_options_test.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/camera/camera_web/example/integration_test/camera_options_test.dart b/packages/camera/camera_web/example/integration_test/camera_options_test.dart index 6fa10222637..5600c511802 100644 --- a/packages/camera/camera_web/example/integration_test/camera_options_test.dart +++ b/packages/camera/camera_web/example/integration_test/camera_options_test.dart @@ -63,7 +63,6 @@ void main() { const AudioConstraints(enabled: true).toJson(), equals({ 'enabled': true, - 'bitrate': 28000, }), ); }); From 25e2241305e5b2bdede14e56ff3b3fd1454d3aab Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Wed, 20 Sep 2023 22:08:15 +0300 Subject: [PATCH 096/108] Update packages/camera/camera_web/lib/src/camera_service.dart Co-authored-by: David Iglesias --- packages/camera/camera_web/lib/src/camera_service.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_web/lib/src/camera_service.dart b/packages/camera/camera_web/lib/src/camera_service.dart index f475022642e..39058125bd6 100644 --- a/packages/camera/camera_web/lib/src/camera_service.dart +++ b/packages/camera/camera_web/lib/src/camera_service.dart @@ -307,8 +307,8 @@ class CameraService { return const Size(320, 240); } - static const int _K = 1000; - static const int _M = _K * _K; + static const int _kiloBits = 1000; + static const int _megaBits = _kiloBits * _kiloBits; /// Maps the given [resolutionPreset] to video bitrate. int mapResolutionPresetToVideoBitrate(ResolutionPreset resolutionPreset) { From 6fd3f079078e6ba0f4c96ed552714f8a2fd01421 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Wed, 20 Sep 2023 22:08:43 +0300 Subject: [PATCH 097/108] Update packages/camera/camera_web/lib/src/camera.dart Co-authored-by: David Iglesias --- packages/camera/camera_web/lib/src/camera.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_web/lib/src/camera.dart b/packages/camera/camera_web/lib/src/camera.dart index b609275cfc4..e5c8bae58d6 100644 --- a/packages/camera/camera_web/lib/src/camera.dart +++ b/packages/camera/camera_web/lib/src/camera.dart @@ -45,7 +45,7 @@ class Camera { {required this.textureId, required CameraService cameraService, this.options = const CameraOptions(), - this.recorderOptions = const (audioBitrate: null, videoBitrate: null)}) + this.recorderOptions = const (audioBitrate: null, videoBitrate: null),}) : _cameraService = cameraService; // A torch mode constraint name. From ca0cc6b039830abceb726609492e60d345643a7f Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Thu, 21 Sep 2023 01:35:32 +0300 Subject: [PATCH 098/108] applied suggestions --- .../camera/camera_web/lib/src/camera.dart | 12 +++++------ .../camera_web/lib/src/camera_service.dart | 20 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/camera/camera_web/lib/src/camera.dart b/packages/camera/camera_web/lib/src/camera.dart index e5c8bae58d6..acf5ceef888 100644 --- a/packages/camera/camera_web/lib/src/camera.dart +++ b/packages/camera/camera_web/lib/src/camera.dart @@ -41,12 +41,12 @@ class Camera { /// Creates a new instance of [Camera] /// with the given [textureId] and optional /// [options] and [window]. - Camera( - {required this.textureId, - required CameraService cameraService, - this.options = const CameraOptions(), - this.recorderOptions = const (audioBitrate: null, videoBitrate: null),}) - : _cameraService = cameraService; + Camera({ + required this.textureId, + required CameraService cameraService, + this.options = const CameraOptions(), + this.recorderOptions = const (audioBitrate: null, videoBitrate: null), + }) : _cameraService = cameraService; // A torch mode constraint name. // See: https://w3c.github.io/mediacapture-image/#dom-mediatracksupportedconstraints-torch diff --git a/packages/camera/camera_web/lib/src/camera_service.dart b/packages/camera/camera_web/lib/src/camera_service.dart index 39058125bd6..4a0add3ebbc 100644 --- a/packages/camera/camera_web/lib/src/camera_service.dart +++ b/packages/camera/camera_web/lib/src/camera_service.dart @@ -315,15 +315,15 @@ class CameraService { switch (resolutionPreset) { case ResolutionPreset.max: case ResolutionPreset.ultraHigh: - return 8 * _M; + return 8 * _megaBits; case ResolutionPreset.veryHigh: - return 4 * _M; + return 4 * _megaBits; case ResolutionPreset.high: - return 1 * _M; + return 1 * _megaBits; case ResolutionPreset.medium: - return 400 * _K; + return 400 * _kiloBits; case ResolutionPreset.low: - return 200 * _K; + return 200 * _kiloBits; } } @@ -332,15 +332,15 @@ class CameraService { switch (resolutionPreset) { case ResolutionPreset.max: case ResolutionPreset.ultraHigh: - return 128 * _K; + return 128 * _kiloBits; case ResolutionPreset.veryHigh: - return 128 * _K; + return 128 * _kiloBits; case ResolutionPreset.high: - return 64 * _K; + return 64 * _kiloBits; case ResolutionPreset.medium: - return 48 * _K; + return 48 * _kiloBits; case ResolutionPreset.low: - return 32 * _K; + return 32 * _kiloBits; } } From 556133e57b3475dccea7e720a1f11bc5c1706e0a Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 25 Oct 2023 02:08:48 +0300 Subject: [PATCH 099/108] actualized --- .../camera/camera_android/example/pubspec.yaml | 1 + .../camera_android_camerax/example/pubspec.yaml | 1 + .../lib/src/android_camera_camerax.dart | 14 ++++++++++++++ .../test/android_camera_camerax_test.dart | 7 +++++-- .../camera_avfoundation/example/pubspec.yaml | 1 + .../camera_avfoundation/ios/Classes/FLTCam.m | 15 ++++++++++----- packages/camera/camera_web/example/pubspec.yaml | 1 + .../camera/camera_windows/example/pubspec.yaml | 1 + 8 files changed, 34 insertions(+), 7 deletions(-) diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index 7708019bcbf..adae639eded 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -9,6 +9,7 @@ environment: dependencies: camera_android: path: ../ + camera_platform_interface: ^2.6.0 flutter: sdk: flutter diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index bcb12411180..cd7261d4088 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -9,6 +9,7 @@ environment: dependencies: camera_android_camerax: path: ../ + camera_platform_interface: ^2.6.0 flutter: sdk: flutter 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 6ec4165d432..c59cec3162b 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 @@ -274,6 +274,20 @@ class AndroidCameraCameraX extends CameraPlatform { return flutterSurfaceTextureId; } + /// Creates an uninitialized camera instance with default settings and returns the camera ID. + /// + /// See [createCameraWithSettings] + @override + Future createCamera( + CameraDescription description, + ResolutionPreset? resolutionPreset, { + bool enableAudio = false, + }) => + createCameraWithSettings( + description, + MediaSettings( + resolutionPreset: resolutionPreset, enableAudio: enableAudio)); + /// Initializes the camera on the device. /// /// Since initialization of a camera does not directly map as an operation to 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 5864a685aa7..42c452f431a 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 @@ -324,8 +324,11 @@ void main() { // Test non-null resolution presets. for (final ResolutionPreset resolutionPreset in ResolutionPreset.values) { - await camera.createCamera(testCameraDescription, resolutionPreset, - enableAudio: enableAudio); + await camera.createCamera( + testCameraDescription, + resolutionPreset, + enableAudio: enableAudio, + ); Size? expectedBoundSize; ResolutionStrategy? expectedResolutionStrategy; diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index e54a33fdf03..96ee26ec9e7 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -9,6 +9,7 @@ environment: dependencies: camera_avfoundation: path: ../ + camera_platform_interface: ^2.6.0 flutter: sdk: flutter diff --git a/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m b/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m index 8d35e716240..ffa1245fce5 100644 --- a/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m +++ b/packages/camera/camera_avfoundation/ios/Classes/FLTCam.m @@ -41,9 +41,9 @@ @interface FLTCam () @property(readonly, nonatomic) int64_t textureId; -@property NSNumber *fps; -@property NSNumber *videoBitrate; -@property NSNumber *audioBitrate; +@property(atomic, readwrite, strong) NSNumber *fps; +@property(atomic, readwrite, strong) NSNumber *videoBitrate; +@property(atomic, readwrite, strong) NSNumber *audioBitrate; @property BOOL enableAudio; @property(nonatomic) FLTImageStreamHandler *imageStreamHandler; @property(readonly, nonatomic) AVCaptureSession *videoCaptureSession; @@ -183,7 +183,7 @@ - (instancetype)initWithCameraName:(NSString *)cameraName _motionManager = [[CMMotionManager alloc] init]; [_motionManager startAccelerometerUpdates]; - NSError *outError; + NSError *outError = nil; if ([_captureDevice lockForConfiguration:&outError]) { [_videoCaptureSession beginConfiguration]; @@ -201,7 +201,12 @@ - (instancetype)initWithCameraName:(NSString *)cameraName [_videoCaptureSession commitConfiguration]; [_captureDevice unlockForConfiguration]; } else { - NSLog(@"error locking device for frame rate change (%@)", outError); + // tests always go there with outError == nil. + if (outError) { + NSLog(@"error locking device for frame rate change (%@)", outError); + *error = outError; + return nil; + } } [self updateOrientation]; diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index 779961fb751..ff9022e12e6 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -6,6 +6,7 @@ environment: flutter: ">=3.7.0" dependencies: + camera_platform_interface: ^2.6.0 camera_web: path: ../ diff --git a/packages/camera/camera_windows/example/pubspec.yaml b/packages/camera/camera_windows/example/pubspec.yaml index c449450fe28..95383bac902 100644 --- a/packages/camera/camera_windows/example/pubspec.yaml +++ b/packages/camera/camera_windows/example/pubspec.yaml @@ -7,6 +7,7 @@ environment: flutter: ">=3.7.0" dependencies: + camera_platform_interface: ^2.6.0 camera_windows: path: ../ From 0b5da815d043923b51a1317068f7f401d31317e8 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Sat, 6 Apr 2024 12:04:50 +0300 Subject: [PATCH 100/108] dart 3.2.3, merged with main. --- packages/camera/camera/example/pubspec.yaml | 5 --- .../camera/lib/src/camera_controller.dart | 2 +- packages/camera/camera/test/camera_test.dart | 41 ++++++++++++++----- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index 98f8e6c19f1..6555d3f352c 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -30,8 +30,3 @@ dev_dependencies: flutter: uses-material-design: true - -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-federated-plugins -dependency_overrides: - {camera: {path: ../../../camera/camera}, camera_android: {path: ../../../camera/camera_android}, camera_avfoundation: {path: ../../../camera/camera_avfoundation}, camera_web: {path: ../../../camera/camera_web}} diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index eb7d5fb8147..fd24b978332 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -949,7 +949,7 @@ class Optional extends IterableBase { if (_value == null) { throw StateError('value called on absent Optional.'); } - return _value!; + return _value; } /// Executes a function if the Optional value is present. diff --git a/packages/camera/camera/test/camera_test.dart b/packages/camera/camera/test/camera_test.dart index c29ae8a764a..6bf949de4ad 100644 --- a/packages/camera/camera/test/camera_test.dart +++ b/packages/camera/camera/test/camera_test.dart @@ -110,6 +110,20 @@ void main() { }); test('Can be initialized', () async { + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); + await cameraController.initialize(); + + expect(cameraController.value.aspectRatio, 1); + expect(cameraController.value.previewSize, const Size(75, 75)); + expect(cameraController.value.isInitialized, isTrue); + }); + + test('can be initialized with media settings', () async { final CameraController cameraController = CameraController.withSettings( const CameraDescription( name: 'cam', @@ -128,20 +142,27 @@ void main() { expect(cameraController.value.aspectRatio, 1); expect(cameraController.value.previewSize, const Size(75, 75)); expect(cameraController.value.isInitialized, isTrue); + expect(cameraController.resolutionPreset, ResolutionPreset.low); + expect(cameraController.enableAudio, true); + expect(cameraController.mediaSettings.fps, 15); + expect(cameraController.mediaSettings.videoBitrate, 200000); + expect(cameraController.mediaSettings.audioBitrate, 32000); }); - test('Can be initialized with default parameters', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - ); + test('default constructor initializes media settings', () async { + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); - expect(cameraController.value.aspectRatio, 1); - expect(cameraController.value.previewSize, const Size(75, 75)); - expect(cameraController.value.isInitialized, isTrue); + expect(cameraController.resolutionPreset, ResolutionPreset.max); + expect(cameraController.enableAudio, true); + expect(cameraController.mediaSettings.fps, isNull); + expect(cameraController.mediaSettings.videoBitrate, isNull); + expect(cameraController.mediaSettings.audioBitrate, isNull); }); test('can be disposed', () async { From b892a0ea7cf15c92a6e4d8af55b89c33203ad162 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Sat, 6 Apr 2024 12:09:04 +0300 Subject: [PATCH 101/108] merged with upstream/main --- .../camera/features/CameraFeatures.java | 61 ---------------- .../features/intfeature/IntFeature.java | 52 -------------- .../android/app/src/main/AndroidManifest.xml | 1 - .../example/integration_test/camera_test.dart | 72 +++++-------------- ...eraCaptureSessionQueueRaceConditionTests.m | 12 +--- .../RunnerTests/CameraMethodChannelTests.m | 11 +-- .../integration_test/camera_options_test.dart | 4 +- .../integration_test/camera_web_test.dart | 26 ++----- .../camera/camera_web/example/pubspec.yaml | 1 - .../lib/src/types/camera_options.dart | 33 +++++---- .../camera_windows/example/pubspec.yaml | 6 +- 11 files changed, 57 insertions(+), 222 deletions(-) delete mode 100644 packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java index ed602e840bd..6c8c1f17a2f 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java @@ -15,7 +15,6 @@ import io.flutter.plugins.camera.features.flash.FlashFeature; import io.flutter.plugins.camera.features.focuspoint.FocusPointFeature; import io.flutter.plugins.camera.features.fpsrange.FpsRangeFeature; -import io.flutter.plugins.camera.features.intfeature.IntFeature; import io.flutter.plugins.camera.features.noisereduction.NoiseReductionFeature; import io.flutter.plugins.camera.features.resolution.ResolutionFeature; import io.flutter.plugins.camera.features.resolution.ResolutionPreset; @@ -43,9 +42,6 @@ public class CameraFeatures { private static final String RESOLUTION = "RESOLUTION"; private static final String SENSOR_ORIENTATION = "SENSOR_ORIENTATION"; private static final String ZOOM_LEVEL = "ZOOM_LEVEL"; - private static final String FPS = "FPS"; - private static final String VIDEO_BITRATE = "VIDEO_BITRATE"; - private static final String AUDIO_BITRATE = "AUDIO_BITRATE"; @NonNull public static CameraFeatures init( @@ -301,61 +297,4 @@ public ZoomLevelFeature getZoomLevel() { public void setZoomLevel(@NonNull ZoomLevelFeature zoomLevel) { this.featureMap.put(ZOOM_LEVEL, zoomLevel); } - - /** - * Sets the instance of the fps feature. - * - * @param fps the {@link IntFeature} instance to set. - */ - public void setFps(@NonNull IntFeature fps) { - this.featureMap.put(FPS, fps); - } - - /** - * Gets the fps feature if it has been set. - * - * @return the fps feature. - */ - @NonNull - public IntFeature getFps() { - return (IntFeature) featureMap.get(FPS); - } - - /** - * Sets the instance of the videoBitrate feature. - * - * @param videoBitrate the {@link IntFeature} instance to set. - */ - public void setVideoBitrate(@NonNull IntFeature videoBitrate) { - this.featureMap.put(VIDEO_BITRATE, videoBitrate); - } - - /** - * Gets the videoBitrate feature if it has been set. - * - * @return the videoBitrate feature. - */ - @NonNull - public IntFeature getVideoBitrate() { - return (IntFeature) featureMap.get(VIDEO_BITRATE); - } - - /** - * Sets the instance of the getAudioBitrate feature. - * - * @param getAudioBitrate the {@link IntFeature} instance to set. - */ - public void setAudioBitrate(@NonNull IntFeature audioBitrate) { - this.featureMap.put(AUDIO_BITRATE, audioBitrate); - } - - /** - * Gets the getAudioBitrate feature if it has been set. - * - * @return the getAudioBitrate feature. - */ - @NonNull - public IntFeature getAudioBitrate() { - return (IntFeature) featureMap.get(AUDIO_BITRATE); - } } diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java deleted file mode 100644 index 4df713608e9..00000000000 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/intfeature/IntFeature.java +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.camera.features.intfeature; - -import android.annotation.SuppressLint; -import android.hardware.camera2.CaptureRequest; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import io.flutter.plugins.camera.CameraProperties; -import io.flutter.plugins.camera.features.CameraFeature; - -/** - * Used to control the fps, videoBitrate and audioBitrate configuration on the {@link - * android.hardware.camera2} API. - */ -public class IntFeature extends CameraFeature { - - @NonNull private Integer currentValue; - - public IntFeature(@NonNull CameraProperties cameraProperties, @NonNull Integer value) { - super(cameraProperties); - currentValue = value; - } - - @NonNull - @Override - public String getDebugName() { - return "IntFeature"; - } - - @SuppressLint("KotlinPropertyAccess") - @Nullable - @Override - public Integer getValue() { - return currentValue; - } - - @Override - public void setValue(@NonNull Integer value) { - currentValue = value; - } - - @Override - public boolean checkIsSupported() { - return true; - } - - @Override - public void updateBuilder(@NonNull CaptureRequest.Builder requestBuilder) {} -} diff --git a/packages/camera/camera_android/example/android/app/src/main/AndroidManifest.xml b/packages/camera/camera_android/example/android/app/src/main/AndroidManifest.xml index f2853039700..cef23162ddb 100644 --- a/packages/camera/camera_android/example/android/app/src/main/AndroidManifest.xml +++ b/packages/camera/camera_android/example/android/app/src/main/AndroidManifest.xml @@ -10,7 +10,6 @@ android:launchMode="singleTop" android:name="io.flutter.embedding.android.FlutterActivity" android:theme="@style/LaunchTheme" - android:exported="true" android:windowSoftInputMode="adjustResize"> diff --git a/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart b/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart index d6a56c0033f..c8fded8ad23 100644 --- a/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart +++ b/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart @@ -81,15 +81,8 @@ void main() { bool previousPresetExactlySupported = true; for (final MapEntry preset in presetExpectedSizes.entries) { - final CameraController controller = CameraController.withSettings( - cameraDescription, - mediaSettings: MediaSettings( - resolutionPreset: preset.key, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - ), - ); + final CameraController controller = + CameraController(cameraDescription, preset.key); await controller.initialize(); final bool presetExactlySupported = await testCaptureImageResolution(controller, preset.key); @@ -137,15 +130,8 @@ void main() { bool previousPresetExactlySupported = true; for (final MapEntry preset in presetExpectedSizes.entries) { - final CameraController controller = CameraController.withSettings( - cameraDescription, - mediaSettings: MediaSettings( - resolutionPreset: preset.key, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - ), - ); + final CameraController controller = + CameraController(cameraDescription, preset.key); await controller.initialize(); await controller.prepareForVideoRecording(); final bool presetExactlySupported = @@ -165,14 +151,10 @@ void main() { return; } - final CameraController controller = CameraController.withSettings( + final CameraController controller = CameraController( cameras[0], - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - ), + ResolutionPreset.low, + enableAudio: false, ); await controller.initialize(); @@ -223,14 +205,10 @@ void main() { return; } - final CameraController controller = CameraController.withSettings( + final CameraController controller = CameraController( cameras[0], - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - ), + ResolutionPreset.low, + enableAudio: false, ); await controller.initialize(); @@ -249,14 +227,10 @@ void main() { return; } - final CameraController controller = CameraController.withSettings( + final CameraController controller = CameraController( cameras[0], - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - ), + ResolutionPreset.low, + enableAudio: false, ); await controller.initialize(); @@ -268,14 +242,10 @@ void main() { /// Start streaming with specifying the ImageFormatGroup. Future startStreaming(List cameras, ImageFormatGroup? imageFormatGroup) async { - final CameraController controller = CameraController.withSettings( + final CameraController controller = CameraController( cameras.first, - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - ), + ResolutionPreset.low, + enableAudio: false, imageFormatGroup: imageFormatGroup, ); @@ -328,14 +298,10 @@ void main() { return; } - final CameraController controller = CameraController.withSettings( + final CameraController controller = CameraController( cameras[0], - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - ), + ResolutionPreset.low, + enableAudio: false, ); await controller.initialize(); diff --git a/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraCaptureSessionQueueRaceConditionTests.m b/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraCaptureSessionQueueRaceConditionTests.m index 5c736a69524..89f40307933 100644 --- a/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraCaptureSessionQueueRaceConditionTests.m +++ b/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraCaptureSessionQueueRaceConditionTests.m @@ -20,15 +20,9 @@ - (void)testFixForCaptureSessionQueueNullPointerCrashDueToRaceCondition { [self expectationWithDescription:@"create's result block must be called"]; FlutterMethodCall *disposeCall = [FlutterMethodCall methodCallWithMethodName:@"dispose" arguments:nil]; - FlutterMethodCall *createCall = - [FlutterMethodCall methodCallWithMethodName:@"create" - arguments:@{ - @"resolutionPreset" : @"medium", - @"fps" : @(15), - @"videoBitrate" : @(200000), - @"audioBitrate" : @(32000), - @"enableAudio" : @(1) - }]; + FlutterMethodCall *createCall = [FlutterMethodCall + methodCallWithMethodName:@"create" + arguments:@{@"resolutionPreset" : @"medium", @"enableAudio" : @(1)}]; // Mimic a dispose call followed by a create call, which can be triggered by slightly dragging the // home bar, causing the app to be inactive, and immediately regain active. [camera handleMethodCall:disposeCall diff --git a/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraMethodChannelTests.m b/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraMethodChannelTests.m index 3a10b0728ee..bd20134db56 100644 --- a/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraMethodChannelTests.m +++ b/packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraMethodChannelTests.m @@ -32,14 +32,9 @@ - (void)testCreate_ShouldCallResultOnMainThread { [[MockFLTThreadSafeFlutterResult alloc] initWithExpectation:expectation]; // Set up method call - FlutterMethodCall *call = [FlutterMethodCall methodCallWithMethodName:@"create" - arguments:@{ - @"resolutionPreset" : @"medium", - @"fps" : @(15), - @"videoBitrate" : @(200000), - @"audioBitrate" : @(32000), - @"enableAudio" : @(1) - }]; + FlutterMethodCall *call = [FlutterMethodCall + methodCallWithMethodName:@"create" + arguments:@{@"resolutionPreset" : @"medium", @"enableAudio" : @(1)}]; [camera createCameraOnSessionQueueWithCreateMethodCall:call result:resultObject]; [self waitForExpectationsWithTimeout:1 handler:nil]; diff --git a/packages/camera/camera_web/example/integration_test/camera_options_test.dart b/packages/camera/camera_web/example/integration_test/camera_options_test.dart index 5600c511802..6619ff41e03 100644 --- a/packages/camera/camera_web/example/integration_test/camera_options_test.dart +++ b/packages/camera/camera_web/example/integration_test/camera_options_test.dart @@ -61,9 +61,7 @@ void main() { testWidgets('serializes correctly', (WidgetTester tester) async { expect( const AudioConstraints(enabled: true).toJson(), - equals({ - 'enabled': true, - }), + equals(true), ); }); diff --git a/packages/camera/camera_web/example/integration_test/camera_web_test.dart b/packages/camera/camera_web/example/integration_test/camera_web_test.dart index a633a08cb7c..d31855f087e 100644 --- a/packages/camera/camera_web/example/integration_test/camera_web_test.dart +++ b/packages/camera/camera_web/example/integration_test/camera_web_test.dart @@ -527,13 +527,10 @@ void main() { .mapResolutionPresetToSize(ResolutionPreset.ultraHigh), ).thenReturn(ultraHighResolutionSize); - final int cameraId = - await CameraPlatform.instance.createCameraWithSettings( + final int cameraId = await CameraPlatform.instance.createCamera( cameraDescription, - const MediaSettings( - resolutionPreset: ResolutionPreset.ultraHigh, - enableAudio: true, - ), + ResolutionPreset.ultraHigh, + enableAudio: true, ); final Camera? camera = @@ -592,12 +589,9 @@ void main() { () => cameraService.mapResolutionPresetToSize(ResolutionPreset.max), ).thenReturn(maxResolutionSize); - final int cameraId = - await CameraPlatform.instance.createCameraWithSettings( + final int cameraId = await CameraPlatform.instance.createCamera( cameraDescription, - const MediaSettings( - resolutionPreset: ResolutionPreset.max, - ), + null, ); final Camera? camera = @@ -653,19 +647,13 @@ void main() { 'if there is no metadata ' 'for the given camera description', (WidgetTester tester) async { expect( - () => CameraPlatform.instance.createCameraWithSettings( + () => CameraPlatform.instance.createCamera( const CameraDescription( name: 'name', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), + ResolutionPreset.ultraHigh, ), throwsA( isA().having( diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index 6554e8412b4..e204c437fb4 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -14,7 +14,6 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ - flutter: sdk: flutter diff --git a/packages/camera/camera_web/lib/src/types/camera_options.dart b/packages/camera/camera_web/lib/src/types/camera_options.dart index 19aae8e001e..ecb729d7454 100644 --- a/packages/camera/camera_web/lib/src/types/camera_options.dart +++ b/packages/camera/camera_web/lib/src/types/camera_options.dart @@ -64,14 +64,16 @@ class AudioConstraints { final bool enabled; /// Converts the current instance to a Map. - Map toJson() => {'enabled': enabled}; + Object toJson() => enabled; @override - bool operator ==(Object other) => - identical(this, other) || - other is AudioConstraints && - runtimeType == other.runtimeType && - enabled == other.enabled; + bool operator ==(Object other) { + if (identical(this, other)) { + return true; + } + + return other is AudioConstraints && other.enabled == enabled; + } @override int get hashCode => enabled.hashCode; @@ -123,14 +125,17 @@ class VideoConstraints { } @override - bool operator ==(Object other) => - identical(this, other) || - other is VideoConstraints && - runtimeType == other.runtimeType && - facingMode == other.facingMode && - width == other.width && - height == other.height && - deviceId == other.deviceId; + bool operator ==(Object other) { + if (identical(this, other)) { + return true; + } + + return other is VideoConstraints && + other.facingMode == facingMode && + other.width == width && + other.height == height && + other.deviceId == deviceId; + } @override int get hashCode => Object.hash(facingMode, width, height, deviceId); diff --git a/packages/camera/camera_windows/example/pubspec.yaml b/packages/camera/camera_windows/example/pubspec.yaml index b026546302f..7a0853acce9 100644 --- a/packages/camera/camera_windows/example/pubspec.yaml +++ b/packages/camera/camera_windows/example/pubspec.yaml @@ -9,8 +9,12 @@ environment: dependencies: camera_platform_interface: ^2.6.0 camera_windows: + # When depending on this package from a real application you should use: + # camera_windows: ^x.y.z + # See https://dart.dev/tools/pub/dependencies#version-constraints + # The example app is bundled with the plugin so we use a path dependency on + # the parent directory to use the current plugin's version. path: ../ - flutter: sdk: flutter From 5665deaa7eaea58aa2060e9ace098b12bcc284a5 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Sat, 6 Apr 2024 12:14:40 +0300 Subject: [PATCH 102/108] removed cast --- packages/camera/camera/lib/src/camera_controller.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index fd24b978332..921b9e5f268 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -986,7 +986,7 @@ class Optional extends IterableBase { Optional transform(S Function(T value) transformer) { return _value == null ? Optional.absent() - : Optional.of(transformer(_value as T)); + : Optional.of(transformer(_value)); } /// Transforms the Optional value. @@ -997,7 +997,7 @@ class Optional extends IterableBase { Optional transformNullable(S? Function(T value) transformer) { return _value == null ? Optional.absent() - : Optional.fromNullable(transformer(_value as T)); + : Optional.fromNullable(transformer(_value)); } @override From 6ff11f79ddbd41a4a1087c38d1e0cc3e39c012d0 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Mon, 8 Apr 2024 12:38:45 +0300 Subject: [PATCH 103/108] remove exessive changes --- packages/camera/camera/README.md | 2 +- .../example/integration_test/camera_test.dart | 86 +- packages/camera/camera/example/lib/main.dart | 11 +- .../example/lib/readme_full_example.dart | 3 +- packages/camera/camera/example/pubspec.yaml | 1 + packages/camera/camera/lib/camera.dart | 1 - .../camera/lib/src/camera_controller.dart | 20 +- .../camera/test/camera_image_stream_test.dart | 171 +-- .../camera/test/camera_preview_test.dart | 1 + packages/camera/camera/test/camera_test.dart | 970 ++++++------------ 10 files changed, 406 insertions(+), 860 deletions(-) diff --git a/packages/camera/camera/README.md b/packages/camera/camera/README.md index 63e0b6a499f..57c5ef22ab1 100644 --- a/packages/camera/camera/README.md +++ b/packages/camera/camera/README.md @@ -128,7 +128,7 @@ class _CameraAppState extends State { super.initState(); controller = CameraController.withSettings( _cameras[0], - mediaSettings: const MediaSettings( + const MediaSettings( resolutionPreset: ResolutionPreset.low, fps: 15, videoBitrate: 200000, diff --git a/packages/camera/camera/example/integration_test/camera_test.dart b/packages/camera/camera/example/integration_test/camera_test.dart index 05ebe83d456..1985d1793c6 100644 --- a/packages/camera/camera/example/integration_test/camera_test.dart +++ b/packages/camera/camera/example/integration_test/camera_test.dart @@ -69,34 +69,28 @@ void main() { expectedSize, Size(image.height.toDouble(), image.width.toDouble())); } - testWidgets( - 'Capture specific image resolutions', - (WidgetTester tester) async { - final List cameras = await availableCameras(); - if (cameras.isEmpty) { - return; - } - for (final CameraDescription cameraDescription in cameras) { - bool previousPresetExactlySupported = true; - for (final MapEntry preset - in presetExpectedSizes.entries) { - final CameraController controller = CameraController.withSettings( - cameraDescription, - mediaSettings: MediaSettings( - resolutionPreset: preset.key, - ), - ); - await controller.initialize(); - final bool presetExactlySupported = - await testCaptureImageResolution(controller, preset.key); - assert(!(!previousPresetExactlySupported && presetExactlySupported), - 'The camera took higher resolution pictures at a lower resolution.'); - previousPresetExactlySupported = presetExactlySupported; - await controller.dispose(); - } + testWidgets('Capture specific image resolutions', + (WidgetTester tester) async { + final List cameras = await availableCameras(); + if (cameras.isEmpty) { + return; + } + for (final CameraDescription cameraDescription in cameras) { + bool previousPresetExactlySupported = true; + for (final MapEntry preset + in presetExpectedSizes.entries) { + final CameraController controller = + CameraController(cameraDescription, preset.key); + await controller.initialize(); + final bool presetExactlySupported = + await testCaptureImageResolution(controller, preset.key); + assert(!(!previousPresetExactlySupported && presetExactlySupported), + 'The camera took higher resolution pictures at a lower resolution.'); + previousPresetExactlySupported = presetExactlySupported; + await controller.dispose(); } - }, - ); + } + }); // This tests that the capture is no bigger than the preset, since we have // automatic code to fall back to smaller sizes when we need to. Returns @@ -134,12 +128,8 @@ void main() { bool previousPresetExactlySupported = true; for (final MapEntry preset in presetExpectedSizes.entries) { - final CameraController controller = CameraController.withSettings( - cameraDescription, - mediaSettings: MediaSettings( - resolutionPreset: preset.key, - ), - ); + final CameraController controller = + CameraController(cameraDescription, preset.key); await controller.initialize(); await controller.prepareForVideoRecording(); final bool presetExactlySupported = @@ -161,14 +151,10 @@ void main() { return; } - final CameraController controller = CameraController.withSettings( + final CameraController controller = CameraController( cameras[0], - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - ), + ResolutionPreset.low, + enableAudio: false, ); await controller.initialize(); @@ -220,14 +206,10 @@ void main() { return; } - final CameraController controller = CameraController.withSettings( + final CameraController controller = CameraController( cameras[0], - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - ), + ResolutionPreset.low, + enableAudio: false, ); await controller.initialize(); @@ -256,14 +238,10 @@ void main() { /// Start streaming with specifying the ImageFormatGroup. Future startStreaming(List cameras, ImageFormatGroup? imageFormatGroup) async { - final CameraController controller = CameraController.withSettings( + final CameraController controller = CameraController( cameras.first, - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - ), + ResolutionPreset.low, + enableAudio: false, imageFormatGroup: imageFormatGroup, ); diff --git a/packages/camera/camera/example/lib/main.dart b/packages/camera/camera/example/lib/main.dart index 222c51abd28..f7b209a768b 100644 --- a/packages/camera/camera/example/lib/main.dart +++ b/packages/camera/camera/example/lib/main.dart @@ -629,15 +629,10 @@ class _CameraExampleHomeState extends State Future _initializeCameraController( CameraDescription cameraDescription) async { - final CameraController cameraController = CameraController.withSettings( + final CameraController cameraController = CameraController( cameraDescription, - mediaSettings: MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: enableAudio, - ), + kIsWeb ? ResolutionPreset.max : ResolutionPreset.medium, + enableAudio: enableAudio, imageFormatGroup: ImageFormatGroup.jpeg, ); diff --git a/packages/camera/camera/example/lib/readme_full_example.dart b/packages/camera/camera/example/lib/readme_full_example.dart index 4d7b4f9ffa1..5b7a2522472 100644 --- a/packages/camera/camera/example/lib/readme_full_example.dart +++ b/packages/camera/camera/example/lib/readme_full_example.dart @@ -4,6 +4,7 @@ // #docregion FullAppExample import 'package:camera/camera.dart'; +import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/material.dart'; late List _cameras; @@ -32,7 +33,7 @@ class _CameraAppState extends State { super.initState(); controller = CameraController.withSettings( _cameras[0], - mediaSettings: const MediaSettings( + const MediaSettings( resolutionPreset: ResolutionPreset.low, fps: 15, videoBitrate: 200000, diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index 6555d3f352c..0964489aa3a 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + camera_platform_interface: ^2.6.0 flutter: sdk: flutter path_provider: ^2.0.0 diff --git a/packages/camera/camera/lib/camera.dart b/packages/camera/camera/lib/camera.dart index adac39a7169..507d6c7cded 100644 --- a/packages/camera/camera/lib/camera.dart +++ b/packages/camera/camera/lib/camera.dart @@ -11,7 +11,6 @@ export 'package:camera_platform_interface/camera_platform_interface.dart' FlashMode, FocusMode, ImageFormatGroup, - MediaSettings, ResolutionPreset, XFile; diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index 921b9e5f268..b937ccefd47 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -232,8 +232,6 @@ class CameraValue { /// To show the camera preview on the screen use a [CameraPreview] widget. class CameraController extends ValueNotifier { /// Creates a new camera controller in an uninitialized state. - /// - /// Deprecated. Please use [withSettings]. CameraController( CameraDescription description, ResolutionPreset resolutionPreset, { @@ -245,15 +243,10 @@ class CameraController extends ValueNotifier { /// Creates a new camera controller in an uninitialized state, using specified media settings like fps and bitrate. CameraController.withSettings( - CameraDescription description, { - MediaSettings? mediaSettings, + CameraDescription description, + this.mediaSettings, { this.imageFormatGroup, - }) : mediaSettings = mediaSettings ?? - const MediaSettings( - resolutionPreset: - kIsWeb ? ResolutionPreset.max : ResolutionPreset.medium, - enableAudio: true), - super(CameraValue.uninitialized(description)); + }) : super(CameraValue.uninitialized(description)); /// The properties of the camera device controlled by this controller. CameraDescription get description => value.description; @@ -265,8 +258,7 @@ class CameraController extends ValueNotifier { /// /// See also: [ResolutionPreset]. ResolutionPreset get resolutionPreset => - mediaSettings.resolutionPreset ?? - (kIsWeb ? ResolutionPreset.max : ResolutionPreset.medium); + mediaSettings.resolutionPreset ?? ResolutionPreset.max; /// Whether to include audio when recording a video. bool get enableAudio => mediaSettings.enableAudio; @@ -291,6 +283,7 @@ class CameraController extends ValueNotifier { bool _isDisposed = false; StreamSubscription? _imageStreamSubscription; + // A Future awaiting an attempt to initialize (e.g. after `initialize` was // just called). If the controller has not been initialized at least once, // this value is null. @@ -400,7 +393,6 @@ class CameraController extends ValueNotifier { if (value.isPreviewPaused || !value.isInitialized || _isDisposed) { return; } - try { await CameraPlatform.instance.pausePreview(_cameraId); value = value.copyWith( @@ -678,7 +670,7 @@ class CameraController extends ValueNotifier { /// /// The supplied [zoom] value should be between 1.0 and the maximum supported /// zoom level returned by the `getMaxZoomLevel`. Throws an `CameraException` - /// when an illegal zoom level is supplied. + /// when an illegal zoom level is suplied. Future setZoomLevel(double zoom) { _throwIfNotInitialized('setZoomLevel'); try { diff --git a/packages/camera/camera/test/camera_image_stream_test.dart b/packages/camera/camera/test/camera_image_stream_test.dart index cda7b54a432..6ac27e513fc 100644 --- a/packages/camera/camera/test/camera_image_stream_test.dart +++ b/packages/camera/camera/test/camera_image_stream_test.dart @@ -20,19 +20,12 @@ void main() { }); test('startImageStream() throws $CameraException when uninitialized', () { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); expect( () => cameraController.startImageStream((CameraImage image) {}), @@ -54,19 +47,12 @@ void main() { test('startImageStream() throws $CameraException when recording videos', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); @@ -84,19 +70,12 @@ void main() { test( 'startImageStream() throws $CameraException when already streaming images', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); cameraController.value = @@ -111,19 +90,12 @@ void main() { }); test('startImageStream() calls CameraPlatform', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); await cameraController.startImageStream((CameraImage image) {}); @@ -133,19 +105,12 @@ void main() { }); test('stopImageStream() throws $CameraException when uninitialized', () { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); expect( cameraController.stopImageStream, @@ -167,19 +132,12 @@ void main() { test('stopImageStream() throws $CameraException when not streaming images', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); expect( @@ -192,19 +150,12 @@ void main() { }); test('stopImageStream() intended behaviour', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); await cameraController.startImageStream((CameraImage image) {}); await cameraController.stopImageStream(); @@ -214,19 +165,12 @@ void main() { }); test('startVideoRecording() can stream images', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); @@ -239,19 +183,12 @@ void main() { }); test('startVideoRecording() by default does not stream', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); diff --git a/packages/camera/camera/test/camera_preview_test.dart b/packages/camera/camera/test/camera_preview_test.dart index b99c1cacc64..4b5a2a5b516 100644 --- a/packages/camera/camera/test/camera_preview_test.dart +++ b/packages/camera/camera/test/camera_preview_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'package:camera/camera.dart'; +import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/packages/camera/camera/test/camera_test.dart b/packages/camera/camera/test/camera_test.dart index 6bf949de4ad..6a1f7927a29 100644 --- a/packages/camera/camera/test/camera_test.dart +++ b/packages/camera/camera/test/camera_test.dart @@ -59,15 +59,9 @@ void main() { test('debugCheckIsDisposed should not throw assertion error when disposed', () { const MockCameraDescription description = MockCameraDescription(); - final CameraController controller = CameraController.withSettings( + final CameraController controller = CameraController( description, - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), + ResolutionPreset.low, ); controller.dispose(); @@ -78,15 +72,9 @@ void main() { test('debugCheckIsDisposed should throw assertion error when not disposed', () { const MockCameraDescription description = MockCameraDescription(); - final CameraController controller = CameraController.withSettings( + final CameraController controller = CameraController( description, - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), + ResolutionPreset.low, ); expect( @@ -129,7 +117,7 @@ void main() { name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - mediaSettings: const MediaSettings( + const MediaSettings( resolutionPreset: ResolutionPreset.low, fps: 15, videoBitrate: 200000, @@ -166,19 +154,12 @@ void main() { }); test('can be disposed', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); expect(cameraController.value.aspectRatio, 1); @@ -191,19 +172,12 @@ void main() { }); test('initialize() throws CameraException when disposed', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); expect(cameraController.value.aspectRatio, 1); @@ -225,19 +199,12 @@ void main() { test('initialize() throws $CameraException on $PlatformException ', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); mockPlatformException = true; @@ -253,18 +220,12 @@ void main() { test('initialize() sets imageFormat', () async { debugDefaultTargetPlatformOverride = TargetPlatform.android; - final CameraController cameraController = CameraController.withSettings( + final CameraController cameraController = CameraController( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), + ResolutionPreset.max, imageFormatGroup: ImageFormatGroup.yuv420, ); await cameraController.initialize(); @@ -310,19 +271,12 @@ void main() { }); test('prepareForVideoRecording() calls $CameraPlatform ', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); await cameraController.prepareForVideoRecording(); @@ -331,19 +285,12 @@ void main() { }); test('takePicture() throws $CameraException when uninitialized ', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); expect( cameraController.takePicture(), throwsA( @@ -364,19 +311,12 @@ void main() { test('takePicture() throws $CameraException when takePicture is true', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); cameraController.value = @@ -391,19 +331,12 @@ void main() { }); test('takePicture() returns $XFile', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); final XFile xFile = await cameraController.takePicture(); @@ -412,19 +345,12 @@ void main() { test('takePicture() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); mockPlatformException = true; @@ -440,19 +366,12 @@ void main() { test('startVideoRecording() throws $CameraException when uninitialized', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); expect( cameraController.startVideoRecording(), @@ -473,19 +392,12 @@ void main() { }); test('startVideoRecording() throws $CameraException when recording videos', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); @@ -503,19 +415,12 @@ void main() { test('getMaxZoomLevel() throws $CameraException when uninitialized', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); expect( cameraController.getMaxZoomLevel, @@ -536,19 +441,12 @@ void main() { }); test('getMaxZoomLevel() throws $CameraException when disposed', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); await cameraController.dispose(); @@ -574,19 +472,12 @@ void main() { test( 'getMaxZoomLevel() throws $CameraException when a platform exception occured.', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance.getMaxZoomLevel(mockInitializeCamera)) @@ -608,19 +499,12 @@ void main() { }); test('getMaxZoomLevel() returns max zoom level.', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance.getMaxZoomLevel(mockInitializeCamera)) @@ -632,19 +516,12 @@ void main() { test('getMinZoomLevel() throws $CameraException when uninitialized', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); expect( cameraController.getMinZoomLevel, @@ -665,19 +542,12 @@ void main() { }); test('getMinZoomLevel() throws $CameraException when disposed', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); await cameraController.dispose(); @@ -703,19 +573,12 @@ void main() { test( 'getMinZoomLevel() throws $CameraException when a platform exception occured.', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance.getMinZoomLevel(mockInitializeCamera)) @@ -737,19 +600,12 @@ void main() { }); test('getMinZoomLevel() returns max zoom level.', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance.getMinZoomLevel(mockInitializeCamera)) @@ -760,19 +616,12 @@ void main() { }); test('setZoomLevel() throws $CameraException when uninitialized', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); expect( () => cameraController.setZoomLevel(42.0), @@ -793,19 +642,12 @@ void main() { }); test('setZoomLevel() throws $CameraException when disposed', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); await cameraController.dispose(); @@ -831,19 +673,12 @@ void main() { test( 'setZoomLevel() throws $CameraException when a platform exception occured.', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance.setZoomLevel(mockInitializeCamera, 42.0)) @@ -869,19 +704,12 @@ void main() { test( 'setZoomLevel() completes and calls method channel with correct value.', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); await cameraController.setZoomLevel(42.0); @@ -891,19 +719,12 @@ void main() { }); test('setFlashMode() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); await cameraController.setFlashMode(FlashMode.always); @@ -915,19 +736,12 @@ void main() { test('setFlashMode() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance @@ -949,19 +763,12 @@ void main() { }); test('setExposureMode() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); await cameraController.setExposureMode(ExposureMode.auto); @@ -973,19 +780,12 @@ void main() { test('setExposureMode() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance @@ -1007,19 +807,12 @@ void main() { }); test('setExposurePoint() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); await cameraController.setExposurePoint(const Offset(0.5, 0.5)); @@ -1031,19 +824,12 @@ void main() { test('setExposurePoint() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance.setExposurePoint( @@ -1065,19 +851,12 @@ void main() { }); test('getMinExposureOffset() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance @@ -1093,19 +872,12 @@ void main() { test('getMinExposureOffset() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance @@ -1127,19 +899,12 @@ void main() { }); test('getMaxExposureOffset() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance @@ -1155,19 +920,12 @@ void main() { test('getMaxExposureOffset() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance @@ -1189,19 +947,12 @@ void main() { }); test('getExposureOffsetStepSize() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance @@ -1218,19 +969,12 @@ void main() { test( 'getExposureOffsetStepSize() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance @@ -1252,19 +996,12 @@ void main() { }); test('setExposureOffset() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance .getMinExposureOffset(cameraController.cameraId)) @@ -1288,19 +1025,12 @@ void main() { test('setExposureOffset() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance .getMinExposureOffset(cameraController.cameraId)) @@ -1332,19 +1062,12 @@ void main() { test( 'setExposureOffset() throws $CameraException when offset is out of bounds', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance .getMinExposureOffset(cameraController.cameraId)) @@ -1396,19 +1119,12 @@ void main() { }); test('setExposureOffset() rounds offset to nearest step', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance .getMinExposureOffset(cameraController.cameraId)) @@ -1477,19 +1193,12 @@ void main() { }); test('pausePreview() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); cameraController.value = cameraController.value .copyWith(deviceOrientation: DeviceOrientation.portraitUp); @@ -1505,19 +1214,12 @@ void main() { test('pausePreview() does not call $CameraPlatform when already paused', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith(isPreviewPaused: true); @@ -1532,19 +1234,12 @@ void main() { test( 'pausePreview() sets previewPauseOrientation according to locked orientation', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith( isPreviewPaused: false, @@ -1562,19 +1257,12 @@ void main() { test('pausePreview() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance.pausePreview(cameraController.cameraId)) .thenThrow( @@ -1594,19 +1282,12 @@ void main() { }); test('resumePreview() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith(isPreviewPaused: true); @@ -1620,19 +1301,12 @@ void main() { test('resumePreview() does not call $CameraPlatform when not paused', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith(isPreviewPaused: false); @@ -1646,19 +1320,12 @@ void main() { test('resumePreview() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); cameraController.value = cameraController.value.copyWith(isPreviewPaused: true); @@ -1680,19 +1347,12 @@ void main() { }); test('lockCaptureOrientation() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); await cameraController.lockCaptureOrientation(); @@ -1714,19 +1374,12 @@ void main() { test( 'lockCaptureOrientation() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance.lockCaptureOrientation( cameraController.cameraId, DeviceOrientation.portraitUp)) @@ -1747,19 +1400,12 @@ void main() { }); test('unlockCaptureOrientation() calls $CameraPlatform', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); await cameraController.unlockCaptureOrientation(); @@ -1773,19 +1419,12 @@ void main() { test( 'unlockCaptureOrientation() throws $CameraException on $PlatformException', () async { - final CameraController cameraController = CameraController.withSettings( - const CameraDescription( - name: 'cam', - lensDirection: CameraLensDirection.back, - sensorOrientation: 90), - mediaSettings: const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + final CameraController cameraController = CameraController( + const CameraDescription( + name: 'cam', + lensDirection: CameraLensDirection.back, + sensorOrientation: 90), + ResolutionPreset.max); await cameraController.initialize(); when(CameraPlatform.instance .unlockCaptureOrientation(cameraController.cameraId)) @@ -1833,8 +1472,11 @@ class MockCameraPlatform extends Mock Future>.value(mockAvailableCameras); @override - Future createCameraWithSettings( - CameraDescription cameraDescription, MediaSettings? mediaSettings) => + Future createCamera( + CameraDescription description, + ResolutionPreset? resolutionPreset, { + bool enableAudio = false, + }) => mockPlatformException ? throw PlatformException(code: 'foo', message: 'bar') : Future.value(mockInitializeCamera); From d71115552c84cbca41053dd6f237344225d7248e Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Mon, 8 Apr 2024 18:58:48 +0300 Subject: [PATCH 104/108] camera preview bug splitted into issue 146424 --- packages/camera/camera/lib/src/camera_preview.dart | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/camera/camera/lib/src/camera_preview.dart b/packages/camera/camera/lib/src/camera_preview.dart index 1ab61bc2d66..53f9034dc85 100644 --- a/packages/camera/camera/lib/src/camera_preview.dart +++ b/packages/camera/camera/lib/src/camera_preview.dart @@ -26,16 +26,13 @@ class CameraPreview extends StatelessWidget { valueListenable: controller, builder: (BuildContext context, Object? value, Widget? child) { return AspectRatio( - aspectRatio: controller.value.isInitialized - ? (_isLandscape() - ? controller.value.aspectRatio - : (1 / controller.value.aspectRatio)) - : 1, + aspectRatio: _isLandscape() + ? controller.value.aspectRatio + : (1 / controller.value.aspectRatio), child: Stack( fit: StackFit.expand, children: [ - if (controller.value.isInitialized) - _wrapInRotatedBox(child: controller.buildPreview()), + _wrapInRotatedBox(child: controller.buildPreview()), child ?? Container(), ], ), From 1f92fe1fd75cb41f73420d48af9c92949252371f Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Mon, 8 Apr 2024 20:04:21 +0300 Subject: [PATCH 105/108] tested --- packages/camera/camera/test/camera_test.dart | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera/test/camera_test.dart b/packages/camera/camera/test/camera_test.dart index 6a1f7927a29..e72c110c21a 100644 --- a/packages/camera/camera/test/camera_test.dart +++ b/packages/camera/camera/test/camera_test.dart @@ -1471,15 +1471,20 @@ class MockCameraPlatform extends Mock Future> availableCameras() => Future>.value(mockAvailableCameras); + @override + Future createCameraWithSettings( + CameraDescription cameraDescription, MediaSettings? mediaSettings) => + mockPlatformException + ? throw PlatformException(code: 'foo', message: 'bar') + : Future.value(mockInitializeCamera); + @override Future createCamera( CameraDescription description, ResolutionPreset? resolutionPreset, { bool enableAudio = false, }) => - mockPlatformException - ? throw PlatformException(code: 'foo', message: 'bar') - : Future.value(mockInitializeCamera); + createCameraWithSettings(description, null); @override Stream onCameraInitialized(int cameraId) => From ad5acc3cefce0c00d28d92d09df7d5d16c0721db Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Mon, 8 Apr 2024 20:18:20 +0300 Subject: [PATCH 106/108] README snipped validated --- packages/camera/camera/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/camera/camera/README.md b/packages/camera/camera/README.md index 57c5ef22ab1..33ee6c4e793 100644 --- a/packages/camera/camera/README.md +++ b/packages/camera/camera/README.md @@ -100,6 +100,7 @@ Here is a small example flutter app displaying a full screen camera preview. ```dart import 'package:camera/camera.dart'; +import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/material.dart'; late List _cameras; From 05ce99c47f21a8c45f2304c8c78aa1889547b3b9 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Thu, 18 Apr 2024 01:38:17 +0300 Subject: [PATCH 107/108] suggestions applied --- packages/camera/camera/README.md | 12 +----------- .../camera/example/lib/readme_full_example.dart | 12 +----------- packages/camera/camera/example/pubspec.yaml | 1 - 3 files changed, 2 insertions(+), 23 deletions(-) diff --git a/packages/camera/camera/README.md b/packages/camera/camera/README.md index 33ee6c4e793..5458b926c49 100644 --- a/packages/camera/camera/README.md +++ b/packages/camera/camera/README.md @@ -100,7 +100,6 @@ Here is a small example flutter app displaying a full screen camera preview. ```dart import 'package:camera/camera.dart'; -import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/material.dart'; late List _cameras; @@ -127,16 +126,7 @@ class _CameraAppState extends State { @override void initState() { super.initState(); - controller = CameraController.withSettings( - _cameras[0], - const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + controller = CameraController(_cameras[0], ResolutionPreset.max); controller.initialize().then((_) { if (!mounted) { return; diff --git a/packages/camera/camera/example/lib/readme_full_example.dart b/packages/camera/camera/example/lib/readme_full_example.dart index 5b7a2522472..0a7c418f4c5 100644 --- a/packages/camera/camera/example/lib/readme_full_example.dart +++ b/packages/camera/camera/example/lib/readme_full_example.dart @@ -4,7 +4,6 @@ // #docregion FullAppExample import 'package:camera/camera.dart'; -import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/material.dart'; late List _cameras; @@ -31,16 +30,7 @@ class _CameraAppState extends State { @override void initState() { super.initState(); - controller = CameraController.withSettings( - _cameras[0], - const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ); + controller = CameraController(_cameras[0], ResolutionPreset.max); controller.initialize().then((_) { if (!mounted) { return; diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index 0964489aa3a..6555d3f352c 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -14,7 +14,6 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ - camera_platform_interface: ^2.6.0 flutter: sdk: flutter path_provider: ^2.0.0 From 61d64caec98f121ec16a1a036151cabd3d18926e Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Fri, 19 Apr 2024 16:54:57 +0300 Subject: [PATCH 108/108] CameraController.withSettings -> CameraController --- packages/camera/camera/CHANGELOG.md | 2 +- .../camera/lib/src/camera_controller.dart | 27 ++++++++++++------- packages/camera/camera/test/camera_test.dart | 16 +++++------ 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index 5a16ef1984c..901548e9b6d 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.10.6 -* Adds support to control video fps and bitrate. See `CameraController.withSettings`. +* Adds support to control video fps and bitrate. See `CameraController` constructor. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. * Updates support matrix in README to indicate that iOS 11 is no longer supported. * Clients on versions of Flutter that still support iOS 11 can continue to use this diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index b937ccefd47..5f90a0a740a 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -232,22 +232,31 @@ class CameraValue { /// To show the camera preview on the screen use a [CameraPreview] widget. class CameraController extends ValueNotifier { /// Creates a new camera controller in an uninitialized state. + /// + /// - [resolutionPreset] affect the quality of video recording and image capture. + /// - [enableAudio] controls audio presence in recorded video. + /// + /// Following parameters (if present) will overwrite [resolutionPreset] settings: + /// - [fps] controls rate at which frames should be captured by the camera in frames per second. + /// - [videoBitrate] controls the video encoding bit rate for recording. + /// - [audioBitrate] controls the audio encoding bit rate for recording. + CameraController( CameraDescription description, ResolutionPreset resolutionPreset, { bool enableAudio = true, + int? fps, + int? videoBitrate, + int? audioBitrate, this.imageFormatGroup, }) : mediaSettings = MediaSettings( - resolutionPreset: resolutionPreset, enableAudio: enableAudio), + resolutionPreset: resolutionPreset, + enableAudio: enableAudio, + fps: fps, + videoBitrate: videoBitrate, + audioBitrate: audioBitrate), super(CameraValue.uninitialized(description)); - /// Creates a new camera controller in an uninitialized state, using specified media settings like fps and bitrate. - CameraController.withSettings( - CameraDescription description, - this.mediaSettings, { - this.imageFormatGroup, - }) : super(CameraValue.uninitialized(description)); - /// The properties of the camera device controlled by this controller. CameraDescription get description => value.description; @@ -266,7 +275,7 @@ class CameraController extends ValueNotifier { /// The media settings this controller is targeting. /// /// This media settings are not guaranteed to be available on the device, - /// if unavailable a lower resolution will be used. + /// if unavailable a [resolutionPreset] default values will be used. /// /// See also: [MediaSettings]. final MediaSettings mediaSettings; diff --git a/packages/camera/camera/test/camera_test.dart b/packages/camera/camera/test/camera_test.dart index e72c110c21a..f10015334d5 100644 --- a/packages/camera/camera/test/camera_test.dart +++ b/packages/camera/camera/test/camera_test.dart @@ -112,18 +112,16 @@ void main() { }); test('can be initialized with media settings', () async { - final CameraController cameraController = CameraController.withSettings( + final CameraController cameraController = CameraController( const CameraDescription( name: 'cam', lensDirection: CameraLensDirection.back, sensorOrientation: 90), - const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), + ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: false, ); await cameraController.initialize(); @@ -131,7 +129,7 @@ void main() { expect(cameraController.value.previewSize, const Size(75, 75)); expect(cameraController.value.isInitialized, isTrue); expect(cameraController.resolutionPreset, ResolutionPreset.low); - expect(cameraController.enableAudio, true); + expect(cameraController.enableAudio, false); expect(cameraController.mediaSettings.fps, 15); expect(cameraController.mediaSettings.videoBitrate, 200000); expect(cameraController.mediaSettings.audioBitrate, 32000);